您的位置:首页 > 编程语言 > C语言/C++

C与C++的区别

2006-04-19 18:35 435 查看
在将C程序向C++程序转换时,应该看一看下面这些C++程序与C程序不同的地方,并做相应的修改:

在声明时,如故哦声明的函数具有void类型之外的返回类型,则在C++函数的实现中必须具有返回值。如果在函数的实现中没有值返回,C可能会给出警告,但是在C++中,这种情况是无法通过编译的。

在C++中,必须对函数定义标题中的变量进行声明,而不能使用旧式C函数的语法(C的头几个版本支持这种旧用法)。例如,下面的函数定义标题在C中是有效的:

void swap(a,b)
double *a,*b;
{
...
}
但是上面的语法在C++中是无效的,必须作如下修改:
void swap(double *a,double *b)

C++引入了严格的类型检查。特别是不能将一个地址或者指针赋值给另外一个不同类型的指针,除非使用类强制转换或者给一个void类型的指针赋值。在C中,在不同类型的指针间赋值只不过会给出警告;但是在C++中,这是一个严重的错误。

在C++中,函数在使用之前必须先进行声明。而在C中,可以无需事先进行函数声明。这时C假定函数的返回类型是int型并且函数的参数列表是不确定的。当然这种编程习惯并不好,最好不要使用。

在C++程序中可能会出现一些C程序中所没有的名称的冲突。例如在C中,可以在将某个全局名称用于结构或者联合的名称之后(这样的名称叫做“标签名称”,与使用typedef定义的名称的用法正好相反),再用它命名某个函数或者变量。因为C++将所有的标示符放在同一个命名空间,所以C++不允许出现这种名称重复使用的情况。型号,这种名称的冲突很少出现。

在使用C和C++源模块混合编程时还要注意另外一个陷阱。对于同一个符号,在生成.obj文件时C++生成一个完全不同的名称。C++的名称转换规则在名称中加入类型信息,这样.obj文件中就会包含类型信息。于是,连接程序就不会将声明为int型的变量Var与声明为float型的Var看作同一个符号(这称为“类型安全连接”)而且,C++的转换规则在应用时是大不相同的,所以不要徒劳地对符号名称做什么假设。

结果,在将C和C++模块进行连接时,它们可能不能识别彼此的符号。不过,C++提供了一个简单的解决办法:在C++中使用extern“C”声明来引入在C中定义的符号。extern"C"声明禁止C++将类型信息加入到名称中。

extern"C"
{
long way_home; //在C模块中定义了way_home
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: