7

私は単純な C プログラムを書こうとしていました。ここで、マクロを定義しました。

#define NAME(x) #x ## _bingo

では、そのうちのどれ (###) が最初に解決されるでしょうか?

ハマった :) 。そんなマクロの優先順位についてググってみました。しかし、関連するものが見つかりませんでした。

4

1 に答える 1

11

では、どちら (# と ##) が最初に解決されるでしょうか?

標準は次のように述べています。

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)
于 2013-09-12T09:08:35.137 に答える