【发布时间】:2013-12-23 06:16:13
【问题描述】:
如果您想将此问题标记为重复问题,请注意我已阅读有关此主题的问题,但我仍不清楚。我的印象是在包含 C 头文件和与 C 代码链接时使用此构造(如果我错了,请纠正我)。这是否意味着在不处理目标文件时我永远不必使用“extern C”?如果我错了,为什么不能将旧的 C 代码编译为 C++,因为它很可能是合法的 C++ 代码?
我对此有点怀疑,因为我发誓我在使用 C++ 中的旧 C 源代码 时遇到过这样的情况,其中链接器错误只能使用“extern C”和库来解决标题确实有
#ifdef __cplusplus
#extern "C"{
#endif
//......
#ifdef _cplusplus
}
#endif
在他们周围。
编辑:很抱歉不清楚,但我想问的是,“extern C”是否仅在包含 C 头文件并与预先存在的 C 目标文件链接时才需要?如果这是真的,(并且似乎从下面的 cmets 判断),为什么库头文件周围有“extern C”子句,为什么不能将它们包含并编译为 C++?
【问题讨论】:
-
"为什么旧的 C 代码不能直接编译为 C++?"即使 C 代码是有效的 C++,
extern C也用于链接编译为 C 的目标文件,这意味着您仍然需要使用基于 C 的调用约定。 -
@ChrisHayes 所以当我不使用预先存在的目标文件时确实如此,我不需要“extern C”?
-
只是为了明确一点(我仍然看到一个密切的投票):其他问题涵盖主题“
extern "C"是否需要if链接到C代码”,这个问题是“extern "C"是否需要当且仅当链接到 C 代码”。请关注仅当。
标签: c++