如何检测外部"C"是否有效

Dan*_*ski 6 c extern c-preprocessor

我试图找到#include放在extern C区块内的所有地方.可以使用预处理器检查这个吗?我想在我的头文件中添加这样的内容:

#ifdef EXTERN_C_IS_IN_EFFECT
#error File included from extern "C" block!
#endif
Run Code Online (Sandbox Code Playgroud)

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

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

#define ASSERT_NO_EXTERN_C void assert_no_extern_c(int); void assert_no_extern_c(double);
Run Code Online (Sandbox Code Playgroud)

i48*_*486 11

也许你可以定义2个具有相同名称和不同参数的函数原型.如果是外部"C"阻止,您将收到警告.它在C++中是允许的.


fuz*_*fuz 7

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

但是,链接规范会嵌套,因此extern "C"您可以将标头放在extern "C++"规范中,以确保它使用C++链接,而不是确保包装器未指定.