我有一个小程序,我可以毫无困难地使用GCC和ICC编译,但我也希望代码能够与G ++和ICPC一起使用。我试着补充一下:
#ifdef __cplusplus
extern "C" {
#endif
一开始就是这样:
#ifdef __cplusplus
}
#endif
在所有头文件的末尾,但我仍然得到几个未定义的引用“...”错误。
答案 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 ++代码。