私は単純な C プログラムを書こうとしていました。ここで、マクロを定義しました。
#define NAME(x) #x ## _bingo
では、そのうちのどれ (#
と##
) が最初に解決されるでしょうか?
ハマった :) 。そんなマクロの優先順位についてググってみました。しかし、関連するものが見つかりませんでした。
私は単純な C プログラムを書こうとしていました。ここで、マクロを定義しました。
#define NAME(x) #x ## _bingo
では、そのうちのどれ (#
と##
) が最初に解決されるでしょうか?
ハマった :) 。そんなマクロの優先順位についてググってみました。しかし、関連するものが見つかりませんでした。
では、どちら (# と ##) が最初に解決されるでしょうか?
標準は次のように述べています。
16.3.2 # 演算子 [cpp.stringize]
2/ [...]
#
and##
演算子の評価順序は規定されていません。
しかし、ここで何を達成しようとしていますか? のようだ:
#define NAME(x) x ## _bingo
x
トークンとを連結したい場合はこれで十分でしょう_bingo
。
例:
NAME(foo)
として展開されます
foo_bingo
編集 :
生成されたトークンをマクロで文字列化する場合NAME
、これを行う方法の例を次に示します (マクロ置換の問題を解決 ->標準の 16.3.1 ):
#define NAME(x) x##_bingo
// Converts the parameter x to a string after macro replacement
// on x has been performed if needed.
#define STRINGIFY(x) DO_STRINGIFY(x)
#define DO_STRINGIFY(x) #x
int main() {
std::string n = STRINGIFY( NAME( foo ) );
std::string n2 = DO_STRINGIFY( NAME(foo) );
// Will print foo_bingo as expected
std::cout << n << std::endl;
// Will print NAME( foo ) because the macro NAME is not expanded
std::cout << n2 << std::endl;
return 0;
}
出力:
foo_bingo
NAME(foo)