プリプロセッサでの文字列連結("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リテラルを連結できることが分かったという記事でした。


スポンサード リンク

この記事のカテゴリ