C与C++两个关系亲密的编程语言,它们本质上是两种语言,只是C++语言设计时要求尽可能的兼容C语言特性,因此C语言中99%以上的功能都可以使用C++语言完成。本文探讨那些存在于C语言中的特性,但是在C++中缺失或者表现出不同行为的特性。了解这些特性能让你更深入地理解这两种语言,但是,本文中所罗列的每一项特性都不是建议你在程序开发中采用的奇淫技巧,而恰恰相反地是应该避免或谨慎使用的特性。为了你的代码可读性更好,移植性更强,请不要在你的代码中的任何地方秀出这样的特性,除非你确认有充足地使用它们的理由。了解它是为了更好地避免它。

C++语言到底是不是C语言的超集之二

C++语言到底是不是C语言的超集之一

字符字面值的类型

字符字面值如’a’,它的类型在C语言中为int整型类型,它的大小与sizeof(int)的结果一致;但是在C++语言中,字面值’a’的类型为char字符类型,它的大小与sizeof(char)的结果一致;如果使用下图1中的代码做测试。

c语言 static const_c语言const static_const在c语言中是什么意思

图1

C语言编译器生成后的程序执行结果sizeof(‘c’)和sizeof(10)结果都为4;但是C++编译器生成后的程序执行结果sizeof(‘c’)为1,sizeof(10)结果为4。

const修饰符变量的链接属性

对于C语言来说如果在一个文件作用域内定义一个const限定符类型的变量,那么这个变量的链接属性(linkage)默认为外部链接,但是对于C++来说,如果这个const限定符没有明确的指定为extern类型,那么它只是一个内部链接。

const在c语言中是什么意思_c语言const static_c语言 static const

图2

图2中使用了两个文件22a.c和22b.c,在顶部的窗口中显示文件22b.c的内容,其中第2行定义了一个含有const修饰符的int型变量g_app。在底部的窗口中显示22a.c的内容,在这个窗口的第3行代码声明了一个外部变量,名称为g_app,那么在进行链接时,C语言的链接器是可以正常生成可执行程序,并正确的输出g_app的值为10。

如果使用C++链接器生成可执行文件时,它会给出如下图3的错误,表示找不到g_app这个符号。

图3

如果想让C++连接器正常链接并生成对应的可执行程序,那么,只需要在图2顶部窗口的文件22b.c添加extern关键字,即变为了extern const int g_app = 10,将这个const限定符修饰的变量显式地转换为外部链接。

inline函数

C和C++语言的inline函数都是使用inline函数体替换函数调用点的函数调用,避免函数调用产生的额外开销。对于C语言而言,如果这个函数只是使用了inline规格符(specifier),那么这个函数的链接属性就是内部链接;但是如果这个函数又使用了extern关键字const在c语言中是什么意思,那么这个指定的inline函数的链接属性就变成了外部链接。

const在c语言中是什么意思_c语言 static const_c语言const static

图4

图5

图6

图4-6分别创建了3个文件23a.c、23b.c和23c.c,图6中定义的函数f仅使用了inline规格符,这个函数的链接属性(linkage)就是内部链接;图5中定义的函数f既使用了inline规格符,又使用了extern关键字,那么这个函数的链接属性就是外部属性,我们使用C语言编译gcc编译并链接这三个文件生成可执行程序。虽然在图5和图6中定义了名称相同的函数,但是由于它们的链接属性不相同,故对于C语言来说它们都是合法的。

但是对于C++语言而言,extern关键字对于inline函数来说不起作用,每一个inline函数都是内部链接属性,使用C++编译器生成可执行程序时,链接器会给出如下的错误:

图7

图7

布尔类型

C语言中的布尔类型为_Bool,只是在头文件stdbool.h中定义了宏bool、true和false,分别对应_Bool、1和0值;但是C++语言中bool为内置类型,它是C++的一个保留关键字。

c语言 static const_const在c语言中是什么意思_c语言const static

图 8

图8中我们通过sizeof操作符计算bool、true和false的大小const在c语言中是什么意思,其中C语言对应的大小分别为1、4和4,而C++语言所对应的对象依次为1、1和1。

sizeof计算struct的大小

sizeof操作符在计算变量类型的大小时采用sizeof name或sizeof(name)两种方式,但是如果计算一个类型的大小时,必须采用含括号的形式,如sizeof(type)的格式。下图9代码中第3行代码声明了一个外部int类型的变量person;在函数f的函数体内第6-9行定义了一个结构体person,之后第10行代码显示sizeof(person)的大小值。对于C语言来说第10行中的person值就是一个int类型的变量,因为C语言中,计算一个结构体类型的大小,其写法应该为sizeof(struct person),而不是sizeof(person);但是对于C++语言来说,表示结构体类型的struct是可以忽略的。因此,对于C语言来说图9对应输出值为4,表示一个整数的大小;而对于C++来说,其输出结果为结构体的大小16。

c语言 static const_const在c语言中是什么意思_c语言const static

图9

这是对于C和C++语言的特性对比的第三篇文章。列出了C和C++语言看起来都存在的特性,但是二者所表现出不同的行为。您在使用C语言或C++过程中可能还会发现二者之间的更多区别,欢迎指出来,让我们一起分享你的C语言学习中的乐趣,谢谢各位!

C++语言到底是不是C语言的超集之二

C++语言到底是不是C语言的超集之一

———END———
限 时 特 惠:本站每日持续更新海量各大内部创业教程,一年会员只需128元,全站资源免费下载点击查看详情
站 长 微 信:jiumai99

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注