gcc のドキュメントでは、インスタンス-fconstant-string-class
に使用されるクラスを変更できる引数を参照しています。@"Objective-C string literal"
このソースを使用すると、これはclangでは機能しないようです:
#import <stdio.h>
#import <objc/runtime.h>
@interface ConstantString
{
Class isa;
char *c_string;
unsigned int len;
}
@end
@implementation ConstantString
- (Class)class {return isa;}
@end
int main(int argc, char *argv[])
{
fprintf(stderr, "%s\n", class_getName([@"foo" class]));
return 0;
}
このコンパイラで次のようにコンパイルします。
$ クラン -v
Apple clang バージョン 4.0 (tags/Apple/clang-421.10.60) (LLVM 3.1svn に基づく)
ターゲット: x86_64-apple-darwin12.0.0
スレッドモデル: posix
$ clang -fconstant-string-class=ConstantString -lobjc constantstring.m
アーキテクチャ x86_64 の未定義のシンボル:
「___CFConstantStringClassReference」、次から参照:
CFString in constantstring-C7icsk.o ld: symbol(s) not found for architecture x86_64
clang: エラー: リンカー コマンドが終了コード 1 で失敗しました (呼び出しを確認するには -v を使用してください)
Foundation にリンクすると、デフォルトの定数文字列クラスがまだ使用されていることがわかります。
$ clang -fconstant-string-class=ConstantString -lobjc constantstring.m -framework Foundation
$ ./a.out
__NSCFConstantString
では、実際に clang を使用して文字列リテラルのカスタム クラスを定義できるでしょうか? また、配列、辞書、および数値リテラルのクラスを変更できますか?