2015-04-17 42 views
6

我试图找到所有放置#include的地方externC block。是否可以使用预处理器来检查?我愿做这样的事情添加到我的头文件:如何检测extern“C”是否生效

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

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

我定义下面的宏,然后在每一个这就需要对列入保护externÇ块头使用它:

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

'extern'根本没有被预处理器注意到。 –

+1

如果你需要这个来找到你有一个extern“C”块的所有文件,你可以把你的代码项目中的所有文件都搜索到你喜欢的IDE并做一个“在整个项目/解决方案/ ...中搜索” – Incubbus

+0

@πάνταῥεῖ嗯。 '#define extern static'? –

回答

11

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

+0

谢谢!这适用于我:void assert_no_extern_c(int); void assert_no_extern_c(double); –

6

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

但是,链接规范是嵌套的,所以不必确保包装器没有指定extern "C",您可以将标题放在extern "C++"规范中以确保它使用C++链接。