27

ビルド設定で定義されたプリプロセッサ マクロがあります

FOO=BAR

その値を、メソッドに渡すことができる Objective-C の文字列リテラルに変換したいと考えています。次の #define は機能しませんが、私が達成しようとしていることを示す必要があります。

 #define FOOLITERAL @"FOO" //want FOOLITERAL to have the value of @"BAR"

 myMethodThatTakesAnNSString(FOOLITERAL);

どういうわけか明らかなものが欠けているだけだと思いますが、必要なものを取得するための適切なプリプロセッサブードゥーを見つけることができないようです。

4

5 に答える 5

36

文字列化演算子 を使用して#、シンボルから C 文字列を作成します。ただし、プリプロセッサの癖により、マクロの 2 つの追加レイヤーを使用する必要があります。

#define FOO BAR
#define STRINGIZE(x) #x
#define STRINGIZE2(x) STRINGIZE(x)
#define FOOLITERAL @ STRINGIZE2(FOO)
// FOOLITERAL now expands to @"BAR" 

余分なレイヤーの理由は、文字列化演算子はマクロの引数でのみ使用でき、他のトークンでは使用できないためです。第 2 に、マクロの引数にマクロ本体で文字列化演算子が適用されている場合、その引数は別のマクロとして展開されません。したがって、FOO展開されることを保証するために、別のマクロでラップします。これにより、展開されたときに、文字列化演算子がそのマクロの本体に表示されないため、STRINGIZE2展開も展開されます。FOO

于 2011-09-30T04:19:14.603 に答える
29

これは、より明確なセマンティクスを備えたAdam Rosenfieldの回答の修正版です。

#define NSStringize_helper(x) #x
#define NSStringize(x) @NSStringize_helper(x)

これを使用して、次のようなコードを置き換えます。

case OneEnumValue: name = @"OneEnumValue"; break;
case AnotherEnumValue: name = @"AnotherEnumValue"; break;

これとともに:

#define case_for_type(type) case type: name = NSStringize(type); break

case_for_type(OneEnumValue);
case_for_type(AnotherEnumValue);
于 2013-02-04T01:09:39.497 に答える
-2

正確にどのようなエラーが表示されますか? このタイプのことは、期待どおりに機能します。

#define kMyString @"MyString"

[NSString stringWithFormat:@"macro: %@", kMyString];
于 2011-09-30T04:12:44.473 に答える