14

重複の可能性:
## とLINEを使用した C マクロの作成(位置決めマクロを使用したトークン連結)

__LINE__マクロを使用して、さまざまな変数名を生成しようとしています。Benchmark (utils 名前空間にある) というスコープ付きのベンチマーク クラスがあり、そのコンストラクターは文字列を取ります。作成したマクロ定義は次のとおりです。

#define BENCHMARK_SCOPE utils::Benchmark bm##__LINE__(std::string(__FUNCTION__))

残念ながら、これにより次のエラーが発生します。

<some_file_name>(59): error C2374: 'bm__LINE__' : redefinition; multiple initialization

__LINE__これにより、マクロが展開されないという結論に至ります。この投稿に従ってマクロスを作成しました。__LINE__が拡張されない理由はありますか?

編集:おそらくコンパイラ情報も関連しています。ビジュアルスタジオ2010を使用しています。

4

3 に答える 3

18

2 つのマクロを組み合わせて使用​​する必要があります。

#define COMBINE1(X,Y) X##Y  // helper macro
#define COMBINE(X,Y) COMBINE1(X,Y)

そして、それを次のように使用します。

COMBINE(x,__LINE__);
于 2012-04-30T07:15:22.763 に答える
5

このコードを試してください。古いプロジェクトで使用しました

#define CONCATENATE_DIRECT(s1, s2) s1##s2
#define CONCATENATE(s1, s2) CONCATENATE_DIRECT(s1, s2)
#ifdef _MSC_VER // Necessary for edit & continue in MS Visual C++.
# define ANONYMOUS_VARIABLE(str) CONCATENATE(str, __COUNTER__)
#else
# define ANONYMOUS_VARIABLE(str) CONCATENATE(str, __LINE__)
#endif 


int ANONYMOUS_VARIABLE(var)

編集:

プリコンパイル済みヘッダーも使用する場合にのみ、Visual Studio でCOUNTERを使用する必要があると思います。

于 2012-04-30T07:13:39.713 に答える
5

トークンの貼り付けを使用しています。これは、再帰的なマクロ展開のに行われます (トークン ペーストを使用して、呼び出したいマクロの名前を取得できます)。したがって:

#define PASTE(a,b) a ## b

に渡された正確な引数を貼り付け、PASTE結果の新しいトークンを展開しようとします。必要な効果を得るには、追加レベルの間接化が必要です。

#define PASTE_HELPER(a,b) a ## b
#define PASTE(a,b) PASTE_HELPER(a,b)

ここで、引数は が呼び出されるPASTE前に展開されます。PASTE_HELPER

于 2012-04-30T07:47:08.730 に答える