通常,在C语言的头文件中经常可以看到类似下面这种形式的代码:
#ifdef __cplusplus
extern "C" {
#endif
/**** some declaration or so *****/
#ifdef __cplusplus
}
#endif /* end of __cplusplus */
那么,为什么要这么做呢?
实际上,采用extern "C" {} 这种形式的声明,可以使得CPP与C之间的接口具有互通性,不会由于语言内部的机制导致连接目标文件的时候出现错误。
在编译的时候,C++编译器会将参数类型和函数名连接在一起,于是在程序编译成为目标文件以后,C++编译器可以直接根据目标文件中的符号名将多个目标文件连接成一个目标文件或者可执行文件。
在C语言中,C编译器在编译时通常是在函数名前面添加一个下划线。
由于上述原因,当采用C++与C混合编程的时候,就可能会出现错误。例如在某一头文件中定义了如下函数:
int test(int a, int b);
这个函数的实现位于一个.c文件中,在.cpp文件中调用了这个函数。那么,当C++编译器编译这个函数的时候,就有可能会把这个函数名改成_fooii,这里的ii表示函数的第一参数和第二参数都是整型。而C编译器会将这个函数名编译成_foo。也就是说,在C++编译器得到的目标文件中,foo()函数是由_fooii符号来引用的,而在C编译器生成的目标文件中,foo()函数是由_foo指代的。但连接器工作的时候,只认目标文件中的符号。于是,连接器将会发现在.cpp中调用了foo()函数,但是在其它的目标文件中却找不到_fooii这个符号,于是提示连接过程出错。extern "C" {}这种语法形式就是用来解决这个问题的。
阅读(706) | 评论(0) | 转发(0) |