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

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

#ifdef __cplusplus extern "C" { #endif 

在开头和这个:

 #ifdef __cplusplus } #endif 

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

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

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

如果您的代码在C和C ++的公共子集中,您应该已经能够使用任一编译器进行编译,但是我无法看到这样做的原因(除了处理最少惊喜的原则,因为C ++更严格一些事情)。

你得到未定义的引用,因为声明和定义不匹配,如果你把extern "C" ,这可以防止名称错误发生:但在这种情况下,这只发生在你的头文件中。

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

请参阅我之前对这个问题的回答: 何时用简单的单词来表示extern“C”?

它应该有希望明确如何混合C和C ++代码。