2

私はいくつかのオープンソース プロジェクトを見ていますが、次のようなものがあります。

NSLog(@"%s w=%f, h=%f", #size, size.width, size.height)

サイズ記号の直前の「#」の意味は何ですか? それはC文字列のある種の接頭辞ですか?

4

3 に答える 3

4

これはマクロ定義の本体ですか? 次に、#次の識別子を文字列化するために使用できます。つまり、「文字列」(コードなし) を出力します。

于 2009-04-28T18:20:04.503 に答える
4

の正式名称#stringizing operatorです。引数を引用符で囲み、必要に応じて埋め込まれた引用符やバックスラッシュをエスケープして、C 文字列定数を作成します。マクロの定義内でのみ許可され、通常のコードでは許可されません。例えば:

// This is not legal C
const char *str = #test

// This is ok
#define STRINGIZE(x) #x
const char *str1 = STRINGIZE(test);      // equivalent to str1 = "test";
const char *str2 = STRINGIZE(test2"a\"");  // equivalent to str2 = "test2\"a\\\"";

関連するプリプロセッサ オペレータは、トークン貼り付けオペレータ ##です。2 つのトークンを取り、それらを貼り付けて 1 つのトークンを取得します。文字列化演算子と同様に、マクロ定義でのみ使用でき、通常のコードでは使用できません。

// This is not legal C
int foobar = 3;
int x = foo ## bar;

// This is ok
#define TOKENPASTE(x, y) x ## y
int foobar = 3;
int x = TOKENPASTE(foo, bar);  // equivalent to x = foobar;
于 2009-04-29T04:44:38.230 に答える