6

コンテキストに応じて C++ または Objective-C を発行できるマクロ定義を作成しようとしていますが、マクロ内で NSString を簡単に構築できないようです。C++ バージョンは通常の文字列を使用するため単純ですが、NSString を発行するものを作成するのは難しいことがわかります。

#define FOO(x) bar(@##x)

意図した結果は、次のプレフィックスを付けて、文字列引数を NSString 引数に変換すること@です。

FOO("x")
// => bar(@"x")

代わりに、コンパイルを妨げるエラーが表示されます。

Pasting formed '@"x"', an invalid preprocessing token
4

3 に答える 3

5
NSString *x = @"text";

等しい:

NSString *x = CFSTR("text");

PS NSString* と CFStringRef と __CFString* と NSCFStringRef はすべて同じです: Toll-Free Bridged Types

于 2012-06-06T19:48:24.677 に答える
3

##有効な前処理トークンを一緒に形成しない限り、 を使用して要素を連結することはできませんが、次NSStringのように、C 文字列を取る のコンストラクタを呼び出すことができます。

#define FOO(x) [NSString stringWithUTF8String:(x)]
于 2012-06-06T19:56:35.720 に答える
3

ええと、なぜこれではないのですか:

#define FOO(x) bar(@x)

?

トークンの貼り付けや文字列化など、奇妙なことを行う必要はありません。置換ポイントの引数リストの内容の前に @ 記号を付けたいだけです。だからそれをしてください。

于 2012-06-06T20:32:00.187 に答える