我正在尝试找到#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);
答案 0 :(得分:11)
也许你可以定义两个具有相同名称和不同参数的函数原型。如果是外部“C”阻止,您将收到警告。它在C ++中是允许的。
答案 1 :(得分:7)
这是不可能的,因为预处理器在任何语法分析完成之前运行;也就是说,预处理器甚至不知道extern "C"
是什么,它的行为也不能依赖于这种指令的存在。
但是,链接规范会嵌套,因此您可以将标头置于extern "C"
规范中,以确保它使用C ++链接,而不是确保包装器未指定extern "C++"
。