|
|
发表于 2006-2-19 18:43:22
|
显示全部楼层
Post by sybaselu
鄙人这么理解:
1:extern "C" void Foo_Demo()
只能出现在.cpp文件中,因为.c不支持extern "C"编译指令。当在.cpp中指明一个变量或函数为extern "C"时,实际上告诉C++编译器不要按照C++的编译方式处理这种函数或变量,而是按照C 编译器的编译方式处理这类函数或变量。C++编译出来的目标代码文件的该函数连接符号名:_FooDemo_, 而C编译出来的却是:_FooDemo。
2:如果把一个用c编绎器编绎的目标代码和一个用C++编绎器编绎的目标代码进行连接,就会出现连接失败的错误。 鄙人就觉得很奇怪,上面明明说到,当C++编译器编译.cpp文件时遇到extern "C"时不是按照C++的编译方式编译,而是按照C的编译方式编译,这样才能解决连接时的问题。而这里又说把按照C编译方式编译的函数与按照C++编译方式编译的函数连接时会出现问题。这不是自相矛盾吗?
extern "C" 只出现在.cpp里
看一下/usr/include/sys/cdefs.h里的定义
/* C++ needs to know that types and declarations are C, not C++. */
#ifdef __cplusplus
# define __BEGIN_DECLS extern "C" {
# define __END_DECLS }
#else
# define __BEGIN_DECLS
# define __END_DECLS
#endif
c++编译器编译的目标文件,如果生成该目标文件的源文件里没有指定它所引用的c库里函数的linkage为c linkage的话, 也就是是声明原型时前面没有加extern "C",那么该目标文件在和c库连接时,才会出现错误
I hope you get it |
|