我的问题主要是关于 C++ 工具链“理解”C 和 C++ 的事实,所以如果我将一些代码提供extern "C"
给 C++ 工具链,我假设它可以理解如何处理它;但是如果我将代码提供extern "C++"
给 C 工具链呢?
预期的行为是什么?
如果编译器也理解 C++,它可能会接受它。如果它是纯 C 编译器,它将反对(就像它会extern "C"
因为该语法无效 C 一样 - 这就是为什么它通常包含#ifdef __cplusplus
或类似的原因)
它应该无法编译,它不是有效的 C 语法。
使头文件中的 C 声明同时在 C 和 C++ 编译器中工作的标准方法是依赖仅在 C++ 编译器中定义的预处理器符号。像这样:
#ifdef __cplusplus
extern "C" {
#endif
// C declarations here
// ...
#ifdef __cplusplus
}
#endif
每个 C++ 编译器都定义了 __cplusplus。
extern "C++"
不是有效的 C 代码,因此符合标准的 C 编译器必须发出诊断。不要求它不编译代码。发出诊断后,编译器可以自由地执行其实现者认为合适的任何事情。
如果您使用此类选项编写了其他一些编译器,则可以执行此操作。
正如@Mats 所回答的那样,我们还有另一个过程来实现这一点#ifdef __cplusplus
。此外,您正在尝试的只是错误。