extern"C"---当*正好*使用?

use*_*672 2 c++

如果您想将此问题标记为重复,请注意我已经阅读了有关此主题的问题,但我仍然不清楚.我的印象是,当包含C头并使用C代码链接时使用此构造(如果我错了,请纠正我).这是否意味着在不处理目标文件时我永远不必使用"extern C"?如果我错了,为什么旧​​C代码不能编译为C++,因为它最有可能是合法的c ++代码?

我对它有点不确定因为我发誓我在使用C++中的旧C 源代码时遇到过这种情况,其中链接器错误仅通过"extern C"解决,并且库头确实有

#ifdef __cplusplus
#extern "C"{
#endif
//......
#ifdef _cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

在他们旁边.

编辑:很抱歉不清楚,但我想问的是,只有在包含C头并链接到预先存在的C对象文件时才需要"extern C"吗?如果它是真的,(并且它似乎从下面的评论来判断),为什么库标题周围有"extern C"子句,为什么它们不能被包含并编译为C++?

Cor*_*lks 5

C的名称修改规则是不同的.C和C可以有不同的ABI.单独这些原因要求您extern "C"在C++代码中嵌入C代码时使用.即使编译器可以编译C和C++代码,它也可能对这两种语言使用不同的名称修改规则或ABI.

此外,你的断言"[C代码最有可能......合法的c ++代码"并不完全正确,因为随着时间的推移,C和C++的分歧越来越大.它们有很多相似之处,但它们也存在很多差异.