如何检测 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++ 中是允许的。
我试图找到 #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++ 中是允许的。