extern“C”(C链接)默认情况下

时间:2010-10-05 13:51:28

标签: c++ c linker extern linkage

问题

GCC,MSVC或Clang,或某些组合支持设置链接默认为C?

背景

我有一个大型的混合C / C ++项目,虽然使用C链接在C ++源代码中导出符号既简单又合乎逻辑,但这些相同的源代码假设项目其余部分的内容都是在C ++链接下。

当前的情况要求我明确地包装C源代码中定义的C源代码所使用的内容以及C ++源代码使用extern "C++"的C源代码所使用的所有内容。

最重要的是,我不能将extern "C"放在整个源文件或头文件中,因为实际的C ++内容会抱怨。 (例如来自#include <memory>或我定义的模板。)

2 个答案:

答案 0 :(得分:7)

头文件中的标准模式是:

#ifdef __cplusplus

// C++ stuff

extern "C" {
#endif

// C/C++ stuff

#ifdef __cplusplus
}
#endif

我不确定你还有其他选择。必须在任何地方使用C链接声明C / C ++内容。必须在任何地方用C ++链接声明特定于C ++的东西。

答案 1 :(得分:1)

默认情况下,“C”链接仅对C源有意义,对C ++源无效,反之亦然。 “C”链接通常意味着名称/符号不会被破坏。 “C”链接表达不足以用于C ++源,例如,对于重载函数。