1

同時に、いくつかのグローバル C++ 定数を定義および宣言しようとしています。

constants.hで:

#ifdef DEFINE_CONSTANTS
#define DECLARE_CONSTANT(DECL_, VAL_) extern DECL_ = VAL_
#else
#define DECLARE_CONSTANT(DECL_, VAL_) extern DECL_
#endif

namespace Constants {
    DECLARE_CONSTANT(const char LABEL[], "SomeText");
    DECLARE_CONSTANT(const int REQUEST_TIMEOUT_MS, 5000);
};

constants.cppで:

#define DEFINE_CONSTANTS
#include "constants.h"
#undef DEFINE_CONSTANTS

定数を使用する他のすべてのファイルには、constants.h を含めるだけです

さて、配列初期化子を使用しない場合、上記は問題なく機能します。ただし、次のようなことをしようとすると:

DECLARE_CONSTANT(const int ARRAY[], {0,1,2});

constants.cppをコンパイルすると、初期化子のコンマがプリプロセッサを「混乱」させて、DECLARE_CONSTANT のパラメータが多すぎると判断するため、エラーが発生します (正確なエラーはコンパイラによって異なります)。

これに対処するためのトリックはありますか?他のソリューションも大歓迎です。

4

3 に答える 3

6

これは、プリプロセッサがかなり愚かで、C や C++ の構文や構造について何も知らないためです。したがって{0,1,2}、マクロに対する 3 つの異なる引数として認識されます。

ただし、これには可変引数マクロを使用できる場合があります。

#define DECLARE_CONSTANT(DECL_, ...) extern DECL_ = __VA_ARGS__
于 2013-10-13T16:17:01.943 に答える
0

あなたが必要

#define VALUE(...) __VA_ARGS__

そして、あなたは使用することができます

DECLARE_CONSTANT(const int ARRAY[], VALUE({0,1,2}));

(あなたの特定のケースではヨアヒムの答えの方が簡単ですが、私の答えはより一般的です)

于 2013-10-13T16:31:41.713 に答える