web-dev-qa-db-ja.com

Cプリプロセッサを使用してintを文字列に連結します

[〜#〜] c [〜#を使用して、#define 'd intを#define' d文字列に連結する方法を見つけようとしています。 〜]プリプロセッサ。私のコンパイラはCentOS 5上のGCC 4.1です。このソリューションはMinGWでも動作するはずです。

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

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

これは機能しません。

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

値が数値であり、#に展開されるため、"/home/user/.myapp" 2 6sなしでは機能しません。これは無効です[〜#〜] 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
78
jonescb

古典的な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)

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

139
Lindydancer

有効な方法は、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)
10

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)
2