如何检测外部“C”是否有效

时间:2015-04-17 09:01:20

标签: c c-preprocessor extern

我正在尝试找到#include C 块内放置extern的所有地方。可以使用预处理器检查这个吗?我想在我的头文件中添加类似的东西:

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

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

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

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

2 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:7)

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

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