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
};
在声明时,如故哦声明的函数具有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
};
相关文章推荐
- C++中双冒号::操作符和点号.操作符的区别
- C++ 重写重载重定义区别
- C++中“->”和“.”在使用中有什么区别呢
- C++声明和定义的区别 收藏
- C++中的struct和class的区别
- 【C++】指针与引用的区别
- C++中结构体与类的区别(struct与class的区别)
- 关于C++ 里struct 和 class的区别
- C/C++定义全局变量/常量几种方法的区别
- 关于C++里面的函数中,按值传递与按引用传递的区别
- C++中的标准库与非标准库的区别
- C++ 11 国标标准方面的异常处理与微软在Visual Studio 2012的异常处理的区别
- C++中引用传递与指针传递区别(进一步整理)
- C++中重载、重写、重定义区别
- c++ 堆和栈以及区别
- C/C++数组名与指针区别深入探索
- C++中的继承和组合区别使用
- C++ string char* char[]声明的字符串的区别---补充(17)《Effective C++》
- NDK学习:C与C++在Ndk中的区别
- C++用new创建对象和不用new创建对象的区别解析