在函数外面的cpp宏之后是否有任何强制分号的成语?
用于函数内部的宏的已知解决方案是:
#define MACRO(x) \
do {
x * 2;
} while(0)
但是,假设我有一个如下所示的宏:
#define DETAIL(warning) _Pragma(#warning)
#define WARNING_DISABLE(warning) DETAIL(GCC diagnostic ignore warning)
我可以在宏中强加一个在该语句后强制分号的内容。该陈述可以在函数内部或外部使用:
WARNING_DISABLE("-Wunused-local-typedefs")
#include "boost/filesystem.hpp"
void foo(const int x) {
WARNING_DISABLE("-Wsome-warning")
...
}
是否有任何C / C ++语法会在文件中任何没有副作用的位置强制解析器中出现分号?
编辑:可能的用例:
#define MY_CPPUNIT_TEST_SUITE(test_suite_class) \
WARNING_PUSH \
/* the declaration of the copy assignment operator has been suppressed */ \
INTEL_WARNING_DISABLE(2268) \
/* the declaration of the copy assignment operator has been suppressed */ \
INTEL_WARNING_DISABLE(2270) \
/* the declaration of the copy constructor operator has been suppressed */ \
INTEL_WARNING_DISABLE(2273) \
CPPUNIT_TEST_SUITE(test_suite_class); \
WARNING_POP \
/* force a semi-colon */ \
UDP_KEYSTONE_DLL_LOCAL struct __udp_keystone_cppunit_test_suite ## __LINE__ {}
答案 0 :(得分:9)
您不需要 LINE 技巧 - 只需转发声明某些结构就足够了,这种结构允许多次,并且不需要实际定义。与实际结构的冲突也不应成为问题。
#define DETAIL(warning) _Pragma(#warning) struct dummy
答案 1 :(得分:4)
#define DETAIL(warning) _Pragma(#warning) struct X ## __LINE__ {}
答案 2 :(得分:2)
最简单的是外部函数声明
#define MACRO_END_(LINE) extern void some_inprobable_long_function_name ## LINE(void)
#define MACRO_END MACRO_END_(__LINE__)
线条技巧只在那里,因为一些具有过多警告的编译器会在重复声明时给出警告。
此宏适用于允许声明的任何上下文,因此C99几乎无处不在:
#define DETAIL(warning) _Pragma(#warning) MACRO_END