如何检测 extern "C" 是否生效

How to detect that extern "C" is in effect

我试图找到 #include 位于 extern C 块内的所有位置。是否可以使用预处理器进行检查?我想在我的 header 文件中添加这样的内容:

#ifdef EXTERN_C_IS_IN_EFFECT
#error File included from extern "C" block!
#endif

我也在寻找在这种情况下编译失败的其他方法,例如使用一些特殊的属性。我正在使用 gcc 4.4.7.

我定义了以下宏,然后在每个需要保护以防止包含在 extern C 块中的 header 中使用它:

#define ASSERT_NO_EXTERN_C void assert_no_extern_c(int); void assert_no_extern_c(double);

这是不可能的,因为预处理器在任何语法分析完成之前运行;也就是说,预处理器甚至不知道 extern "C" 是什么,它的动作也不能依赖于这样一个指令的存在。

但是,链接规范会嵌套,因此与其确保包含程序未指定 extern "C",不如将 header 放在 extern "C++" 规范中以确保它使用 C++ 链接。

也许你可以定义2个函数原型,它们具有相同的名称和不同的参数。如果出现 extern "C" 块,您将收到警告。在 C++ 中是允许的。