103

Cプリプロセッサを使用して'dintを'd文字列#defineに連結する方法を理解しようとしています。私のコンパイラはCentOS5のGCC4.1です。このソリューションはMinGWでも機能するはずです。#define

文字列にバージョン番号を追加したいのですが、それを機能させる唯一の方法は、文字列として定義されているバージョン番号のコピーを作成することです。

#define私が見つけた最も近いものは、マクロ引数を引用する方法でしたが、それはsでは機能しません

これは機能しません。

#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER

#値が数値であり、に展開されるため、sがないと機能しません。"/home/user/.myapp" 2 6これは、有効なCではありません。

これは機能しますが、バージョン定義のコピーを持っているのは好きではありません。数字としても必要だからです。

#define MAJOR_VER 2
#define MINOR_VER 6
#define MAJOR_VER_STR "2"
#define MINOR_VER_STR "6"
#define MY_FILE "/home/user/.myapp" MAJOR_VER_STRING MINOR_VER_STRING
4

3 に答える 3

207

古典的なCプリプロセッサの質問...

#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)

#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" STR(MAJOR_VER) STR(MINOR_VER)

追加レベルの間接参照により、プリプロセッサはマクロを文字列に変換する前に展開できます。

于 2011-03-28T13:49:52.713 に答える
15

実用的な方法は、MY_FILEをパラメトリックマクロとして記述することです。

#define MY_FILE(x,y) "/home..." #x #y

編集:「Lindydancer」で指摘されているように、このソリューションは引数のマクロを展開しません。より一般的な解決策は次のとおりです。

#define MY_FILE_(x,y) "/home..." #x #y
#define MY_FILE(x,y) MY_FILE_(x,y)
于 2011-03-28T13:52:09.360 に答える
0

あなたはBOOST_PP_STRINGIZEでそれを行うことができます:

#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" BOOST_PP_STRINGIZE(MAJOR_VER) BOOST_PP_STRINGIZE(MINOR_VER)
于 2011-03-28T13:48:15.527 に答える