A.2 C++和ISO C标准的不兼容项目

条目1 C++中很多关键字是C所没有的(不详细列举)。

条目2 C中字符常量的类型是int,C++中是char。如果在C++代码中同时有以下两个版本的f函数的定义:


void f(char c);

void f(int);


那么,函数调用f('x')会选择void f(char c)版本。

条目3 C++中字符串常量的类型是const char[],而C中字符串常量的类型是char[]。

条目4 C中允许文件范围中的变量重复定义。如:


int var;

int var;


在C中是允许的;而这在C++中是不允许的。

条目5 不带extern关键字的const变量在C++中是internal linkage(内部链接的,即不可以被其他文件中同名变量引用);而在C中则是external liankage(外部链接的,即可以被其他文件中的同名变量引用)。

条目6 C++要求从void*类型变量到其他类型的转化必须是显式的;而C中则不需要显式转换。

条目7 C++中只有非常量非易变对象(non-const,non-volatile)指针可以转换为void*类型。

条目8 C++不接受隐式声明函数。这个特性在ISO C中也逐渐被抛弃,比如:


int main(){printf("hello\n");}


这里因为printf没有定义(没有#include<stdio.h>),C++会编译时报错printf未声明;而C会把printf当作一个int printf(任意参数)的函数类型。如果运行时动态库中不存在printf这个函数的话,则会导致运行时错误。

条目9 不能在结构体或类型的声明上加static关键字。比如:


static struct st{int i;};


在C中static关键字将被忽略;C++中这则是错误的语法。

条目10 C++中typedef的类型别名不能和已有的类型同名。

条目11 常量(const)对象在C++中必须初始化;在C中则没这个限制。

条目12 隐式int类型在C++中被禁止,C中也逐渐抛弃。比如:func(){}这样的声明方式在C语言中是可以的;而在C++中,因为func没有返回值类型则是非法表达式。

条目13 关键字auto在C++11中有新的语义:用于类型自动推导;而C中auto是修饰对象的存储类型的关键字。

条目14 C++中enum对象只能用同类型的enum赋值;而C中可以用任意的整型数对enum变量赋值。C++中enum变量的类型是对应的enum类型;而C中enum对象的类型是int整型。

条目15 函数声明中的空参数在C++中意味着函数没有参数;而在C中则意味着该函数的参数个数未知。

条目16 C++不允许类型定义在函数的参数或返回值类型的位置上;而形如:


void f(struct S{int I;}s);


这样的表达式在C中则可以接受。

条目17 C++不接受老的废弃的函数定义格式:参数在()之外,比如:


void bar()int par1{}


在C++中就是非法的声明。

条目18 作用域内部的结构体在C++中会覆盖作用域外部的同名变量,比如:


char s;

void f(){

struct s{

int i;

};//struct s覆盖char s

}


而在C中不会。

条目19 C++中,嵌套的结构体仅在其父结构体作用域中可见;而在C中,嵌套的结构体则在全局可见,比如:


struct Outter{

struct Inner{

int I;

};

};


在C中使用Inner类型可以直接写:struct Inner in,而C++中使用Inner类型则必须带上其父结构体Outter,则只能写:Out::Inner in。

条目20 C++中typedef形成的类型别名不能重定义为其他类型或变量。如下面的代码就是这样一种情况:


typedef int Int;

struct S{

int Int;//在C中合法,而在C++中非法

};


条目21 C++中volatile的对象不能作为隐式构造函数和隐式赋值函数的参数,比如:


struct X{int i;};

volatile struct X x1={0};

struct X x2(x1);//在C++中非法

struct X x3;

x3=x1;//在C++中同样非法