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

最も簡単なのは extern 関数宣言です

#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 に答える