10

是否有任何成语在函数外部的 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__ {}
4

3 回答 3

9

你不需要LINE技巧 - 前向声明一些结构就足够了,允许多次,不需要实际定义。与实际结构的冲突也不应该成为问题。

#define DETAIL(warning) _Pragma(#warning) struct dummy
于 2014-10-15T20:07:31.247 回答
5
#define DETAIL(warning) _Pragma(#warning) struct X ## __LINE__ {}
于 2013-09-13T13:07:32.947 回答
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
于 2013-09-13T13:27:02.293 回答