用C ++编译的C代码:未定义的引用

时间:2010-05-13 13:53:21

标签: c++ c include undefined-reference

我有一个小程序,我可以毫无困难地使用GCC和ICC编译,但我也希望代码能够与G ++和ICPC一起使用。我试着补充一下:

#ifdef __cplusplus
  extern "C" {
#endif

一开始就是这样:

#ifdef __cplusplus
  }
#endif

在所有头文件的末尾,但我仍然得到几个未定义的引用“...”错误。

4 个答案:

答案 0 :(得分:7)

我认为你错了... extern C用于禁用函数修改;因此,如果您只为头文件执行此操作,当您尝试链接损坏的对象代码时,声明的函数名称将与目标文件中的函数名称不匹配。

无论如何,如果整个应用程序正在编译并与同一个C ++编译器链接,那么extern C将不会添加任何可移植性,它用于将C库与C ++代码混合。

如果你的代码在C和C ++的公共子集中,你应该已经能够用任何一个编译器编译它,但我看不出这样做的原因(除了工作的原因是最少惊喜,因为C ++是对某些事情更加严格。)

答案 1 :(得分:2)

你得到未定义的引用,因为如果放置extern "C",声明和定义不匹配,这会阻止名称重复发生:但在这种情况下,这只发生在头文件中。

答案 2 :(得分:1)

如果其中一个未定义的引用是gxx_personality,那么我会说“fortran”的帖子是正确的。

答案 3 :(得分:1)

请参阅我之前对此问题的回复:When to use extern "C" in simple words?

它应该有助于明确如何混合使用C和C ++代码。