2013-01-16 17 views
25

私はマクロを持っています。 しかし、#intはすべてのことを反省していますか?Cマクロ内の#xは何を意味しますか?</p> <pre><code>#define PRINT(int) printf(#int "%dn",int) </code></pre> <p>私はちょっと結果が何であるかを知っている:例えば

この詳細を忘れてしまいます。誰でも親切に私にヒントを与えることができますか?

ありがとうございます!

+0

この複製可能性がありますhttp://stackoverflow.com/questions/10676999/stringizing-operator – Omkant

答えて

29

このコンテキスト(マクロ定義のパラメータ参照に適用)では、ポンド記号は、このパラメータをマクロに渡された引数のリテラルテキストに展開することを意味します。

この場合、PRINT(5)を呼び出すと、マクロ展開はprintf("5" "%d\n", 5);となり、5 5と表示されます。あまり役に立たない。しかし、PRINT(5+5)と呼ぶと、マクロ展開はprintf("5+5" "%d\n", 5+5);となり、5+5 10という印刷が少し難しくなります。

この例題はthis tutorial on the C preprocessor(これは偶然、c macro pound signの最初のGoogleヒットです)で説明しています。

+0

はこのgcc機能またはANSi C標準ですか? –

+2

@AndersLind:これは標準的な動作です。 '#'演算子のセマンティクスを詳述する§6.10.3.2/ 2を参照してください。 – dreamlax

+0

@dreamlaxうわー、ありがとう。私は10年間のプログラミングの生活の中でこれを使うことはありません... ...まあ、私はほとんどの時間、C++をプログラミングします –

4

これはマクロパラメータの名前の悪い選択ですが、無害です(thanks dreamlax)。

私はそれはStringificationと呼ばれるプロセスである

printf("5" "%d\n",5); 

または

printf("5 %d\n",5); 

として置き換えられますので

PRINT(5); 

のように書いた場合、基本的に#INTが置き換えられにその内容からなる文字列、5 - > "5"

+1

マクロはプリペイドによって拡張されていますそれはC型システムの知識がない。私が知っている限り、 'int'は§6.10(前処理指令)の規則を破っていませんが、それは悪い選択であると私は同意します。 – dreamlax

+0

あなたのStringificationドキュメントへのリンクが死んでいます。更新してください。 – DeathByTensors

+1

@DrewBuckleyを修正しました! –

9

"#" は、それがこのようなマクロを定義すると良いでしょう、変数の名前を表示することができます。

#define PRINT(i) printf(#i "= %d\n", i) 

とこのようにそれを使用する:示さ

int i = 5; 
PRINT(i); 

結果:

i = 5 
関連する問題