56

そんなこと知ってる:

#define foo 4  
#define str(s) #s

with str(foo)writes out: "foo"、 stringify はテキスト展開の最初に実行されるためですが、これは:

 #define xstr(s) str(s)
 #define str(s) #s
 #define foo 4

withxstr(foo)書き込み: "4".

なんで?プロセスに含まれる手順は何ですか?

4

2 に答える 2

60
于 2013-06-07T18:25:43.103 に答える
15

最初のケース

  1. Evaluate str(foo):str(foo)#foo置き換えます。"foo"

2 番目のケース

  1. Evaluate xstr(foo):xstr(foo)str(<foo-value>)置き換えます。str(4)
  2. Evaluate str(4):str(4)#4置き換えます。"4"

一般的、

プリプロセッサは、評価するものがなくなるまで、マクロ変数を展開するマクロ関数を評価します。

あなたが定義する場合

#define xstr(s) str(s) + 1
#define str(s) s + 1

次のコードで

#define foo 4

int main()
{
    std::cout << str(foo) << '\n' 
              << xstr(foo) << '\n' ;

} 

それは次のように評価されます

最初の文字列

  1. str(foo)で置き換えます<foo-value> + 14 + 1
  2. 代わりになるものはもうありません。仕上げ。

結果は 4 + 1

2 番目の文字列

  1. xstr(foo)で置き換えますstr(<foo-value>) + 1str(4) + 1
  2. str(4)で置き換えます<4-value> + 14 + 1
  3. 代わりになるものはもうありません。

結果は 4 + 1 + 1

于 2013-06-07T17:30:54.590 に答える