LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: sybaselu

关于这个宏定义的疑惑

[复制链接]
发表于 2006-2-18 18:59:18 | 显示全部楼层
不是为了重载
是为了让g++编译出来的object file能够和用gcc编译出来的库进行连接
举个反例
如果没有extern "C"
那么c++程序里就不能用printf这样的函数
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-19 14:02:44 | 显示全部楼层
鄙人学识浅薄.
TO:rickxbx: "并不是“为了”重载,而是防止编译器对其进行名字分裂"
   这里的“其”是指谁?
TO:zhllg:"如果没有extern "C" ,那么c++程序里就不能用printf这样的函数",那么如果要使 C++中可以使用printf这样的函数,这里的extern "C" 后面因该跟什么呢?
回复 支持 反对

使用道具 举报

发表于 2006-2-19 14:07:47 | 显示全部楼层
extern "C"是头文件里的
如果你不是要写头文件
完全不必理会它
回复 支持 反对

使用道具 举报

发表于 2006-2-19 14:58:49 | 显示全部楼层
Post by sybaselu
鄙人学识浅薄.
TO:rickxbx: "并不是“为了”重载,而是防止编译器对其进行名字分裂"
   这里的“其”是指谁?


如,extern "C" int printf(const char* format,...);
“其”指的就是printf
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-19 15:51:30 | 显示全部楼层
鄙人这么理解:
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++编译方式编译的函数连接时会出现问题。这不是自相矛盾吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-19 16:22:54 | 显示全部楼层
总之,extern "C“ FooDemo() //这个函数的的实现是用.c来完成的还是用.cpp来完成的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-19 16:58:39 | 显示全部楼层
总之,extern "C" FooDeom() //这里的函数FooDemo()是在.c中实现还是.cpp中实现。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-19 17:08:01 | 显示全部楼层
按照上面的说法这里的函数FooDemo()应该是用.c来实现的(这样才表示在.cpp中调用.c中的函数),但是在鄙人这里的SDK中所有被声明为extern"C"的函数都是用.cpp来实现的。
回复 支持 反对

使用道具 举报

发表于 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
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-20 09:23:32 | 显示全部楼层

  1. //Header1.h
  2. ...
  3. extern "C" Display{};
  4. ...
复制代码

  1. //Source1.cpp
  2. ...
  3. extern "C" Dispaly();
  4. int main()
  5. {
  6.    Display();
  7. }
复制代码

  1. //Sourc2.c
  2. ...
  3. extern "C" Display();
  4. int main()
  5. {
  6. }
复制代码

It seems that any error message appeared, certainly so there is no synatx error in these file, right?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表