【发布时间】:2014-10-16 04:07:31
【问题描述】:
是否有任何成语强制在函数外部的 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__ {}
【问题讨论】:
-
我想使用的 other 示例是在为嵌入式编译时指定代码部分,这是一个编译指示,所以如果它是
CODE_SECTION(...);那就太好了而不是CODE_SECTION(...)。显然这不是世界末日,但想知道是否有人拥有预处理器来完成此任务? -
我唯一能想到的就是将
_Pragma(#x); typedef int __dummy_ ## __LINE__放在上面,但最终会出现大量关于 gcc 4.8.1 上未使用的 typedef 的警告 -
警告可以被禁用,你知道的 ;)
-
你的问题不是分号,是同一行当前位置后面的任何字符,我不认为一般问题可以解决。承认无法解决一般问题,只需保持原样并用宏记录它:行中不能有多余的字符。
-
@SvenS :) 我知道,如果有什么东西没有警告就好了
标签: c++ c c-preprocessor