5

我的问题主要是关于 C++ 工具链“理解”C 和 C++ 的事实,所以如果我将一些代码提供extern "C"给 C++ 工具链,我假设它可以理解如何处理它;但是如果我将代码提供extern "C++"给 C 工具链呢?

预期的行为是什么?

4

4 回答 4

7

如果编译器也理解 C++,它可能会接受它。如果它是纯 C 编译器,它将反对(就像它会extern "C"因为该语法无效 C 一样 - 这就是为什么它通常包含#ifdef __cplusplus或类似的原因)

于 2013-08-17T12:27:14.493 回答
4

应该无法编译,它不是有效的 C 语法。

使头文件中的 C 声明同时在 C 和 C++ 编译器中工作的标准方法是依赖仅在 C++ 编译器中定义的预处理器符号。像这样:

#ifdef __cplusplus
extern "C" {
#endif

// C declarations here
// ...

#ifdef __cplusplus
}
#endif

每个 C++ 编译器都定义了 __cplusplus。

于 2013-08-17T12:35:11.323 回答
4

extern "C++"不是有效的 C 代码,因此符合标准的 C 编译器必须发出诊断。不要求它不编译代码。发出诊断后,编译器可以自由地执行其实现者认为合适的任何事情。

于 2013-08-17T12:42:00.603 回答
2

如果您使用此类选项编写了其他一些编译器,则可以执行此操作。

正如@Mats 所回答的那样,我们还有另一个过程来实现这一点#ifdef __cplusplus。此外,您正在尝试的只是错误。

于 2013-08-17T12:35:39.807 回答