プリプロセッサでの文字列連結("aaa" "bbb"
→ "aaabbb"
)を@"……"
形式のNSStringリテラルに対して行いたかったので、どうすればよいか試してみました。
コードを書いてみたところ、次の2通りがうまくいきました。少なくとも、左側の文字列がNSStringのリテラルであれば良いようです。
#import <Foundation/Foundation.h> #import <stdio.h> int main(void) { @autoreleasepool { NSString *s1 = @"Hello " "world"; NSString *s2 = @"Hello " @"world"; // コンパイルエラー // NSString *s3 = "Hello " @"world"; puts([s1 UTF8String]); puts([s2 UTF8String]); } } |
s3のコメントアウトを外すと、次のようなコンパイルエラーになります。
t.m:10:24: error: implicit conversion of a non-Objective-C pointer type 'char *' to 'NSString *' is disallowed with ARC NSString *s3 = "Hello " @"world"; ^~~~~~~~ t.m:10:19: warning: incompatible pointer types initializing 'NSString *__strong' with an expression of type 'char [7]' [-Wincompatible-pointer-types] NSString *s3 = "Hello " @"world"; ^ ~~~~~~~~ @ t.m:10:32: error: expected ';' at end of declaration NSString *s3 = "Hello " @"world"; ^ ; 1 warning and 2 errors generated.
なお、Boxed C Stringsを使ったこのコードもコンパイルできることを確かめました。
#import <Foundation/Foundation.h> #import <stdio.h> int main(void) { @autoreleasepool { NSString *s = @("Hello " "world"); puts([s UTF8String]); } } |
@(式)でオブジェクトになる構文で、式の型がchar*またはconst char*ならNSString *オブジェクトが生成されます。
というわけで、@"a" "b"
または@"a" @"b"
の構文でNSStringリテラルを連結できることが分かったという記事でした。
スポンサード リンク |
この記事のカテゴリ
- Objective-C ⇒ NSStringリテラルの連結