2009-11-06 23 views
6

とは何ですか?a##b & #aこのCコードはどのように機能しますか?

#define f(a,b) a##b 
    #define g(a) #a 
    #define h(a) g(a) 

    main() 
    { 
      printf("%s\n",h(f(1,2))); //how should I interpret this?? [line 1] 
      printf("%s\n",g(f(1,2))); //and this? [line 2] 
    } 

このプログラムはどのように機能しますか?


出力は今、私がどのようにa##b & #a仕事を理解

12 
f(1, 2) 

です。 しかし、2つの場合(1行目と2行目)の結果が異なるのはなぜですか?

+3

このプログラムを実行するとどうなりますか?そうすることで、何が起こっているのか理解するのに役立ちます。 –

+1

本当に、そのコードをしばらく再生すると光が放たれます。そして、あなたが特定の質問を持っているなら、ここで彼らに尋ねるのは自由に落ちました – sharptooth

答えて

19

となるであろう。プリプロセッサでのみ使用できます。

f(1,2)となる。1 ## 212となる。

#演算子自体はとなります。トークン:#a"a"になります。したがって、プリプロセッサを実行すると、g(f(1,2))"f(1,2)"になります。

h(f(1,2))#12になり、プリプロセッサがそれを乗り越えて"12"になります。

4

a ## bはコードをtogatherに貼り付けます。そうF

(1,2)##が一緒になって2つのトークンを連結し12

+2

これは問題の半分に過ぎません。 –

0

## bは、文字列リテラル、G(3)になるように "3" Fように(1,2)

#Aが "12" であり、リテラルAおよびBの文字列であるcontatenation

3

f(a、b)マクロは引数を連結し、g(a)は引数を文字列に変換し、h(a)はg(a)のヘルパーマクロです。私はそれがなると思う出力:

12 
f(1,2) 

理由は、hは(a)のマクロは、引数をgに渡す前に展開さいっぱいであることを引き起こすことがある(a)のG(a)に拡大することなく、その引数を文字通りかかりますしながら、それらを最初に。

+0

なぜ2番目のprintfは '' 12 "'の代わりに '' f(1,2) ''に終わるのでしょうか? – Moeb

+0

なぜこれが起こるのですか?h(a)マクロは引数をg(a)に渡す前に完全に展開させ、g(a)は最初に展開せずに引数を文字どおり取ります。 ? – Moeb

0

##はマクロ連結演算子です。したがって、たとえばf(foo,bar)foobarに相当します。

5

これらのような質問(また、プリプロセッサに関係する実際の問題)については、のコードを実際に読み取ると非常に役に立ちます。の前処理が行われています。これを行うにはどのように

は、コンパイラによって異なりますが、gccで、あなたはこの使用します。だから、

$ gcc -E test.c 

(snip) 
main() 
{ 
     printf("%s\n","12"); 
     printf("%s\n","f(1,2)"); 
} 

を、あなたはシンボルが両方の連結、および文字列になっていることがわかります。

+0

なぜ2番目のprintfは '' 12 "'の代わりに '' f(1,2) ''に終わるのですか? – Moeb

+0

@hanifr:g()マクロは引数を文字列化するので、私は推測します。 – unwind

0
 
    #define f(a,b) a##b 
    #define g(a) #a 
    #define h(a) g(a) 

だから、##に関係なく、彼らが何であるかの種類、直接一緒に2つの部品を組み合わせていない... はあなたの例を与える。.. printf("%d\n",f(1,2));あなたはfをここに意味し、12を得る(1,2)が12であります整数。

 
    int a2 = 100; 
    printf("%d\n",f(a,2)); 

ここでf(a、2)はラベルです。コードコンテキストのラベルを指しています。int a2 = 100がなければ、コンパイルエラーが発生します。 そして#aは、文字列には何でも変わります... そしてh(a) g(a) それは非常に奇妙です.. h(a)を呼び出すとg(a)に変わり、aをgに渡しますa)は、まず、aが何であるかを解釈します。だから、g(a)する前にaはf(a、b)= a ## b = 12に変換されます。

関連する問題