将类名转为String,同时带有编译检查
1 2 3 4 5 6 7 8
|
#define CLASS_NAME(class) @(((void)(NO && ((void)[class new], NO)), #class))
|
逗号运算符
逗号运算符 - 维基百科,自由的百科全书
1 2 3 4 5 6 7
|
int a=1, b=2, c=3; int i = (a += 2, a + b);
|
1 2 3 4 5 6 7 8 9 10 11
| @(((void)(NO && ((void)[class new], NO)), #class))
@(((void)(NO && ((void)[class new], NO)), #class)) => ((void)[class new], NO)
@(((void)(NO && NO), #class) => (void)(NO && NO))
@(((void)NO, #class))
@(((void)(NO && ((void)[class new], NO)), #class)) => @(#class)
@((((void)[class new], NO), #class))
|
void的作用
由于左侧的算式是一个未使用的值,为避免编译器 warning。通过 void 强转一下。
@() 的作用
转 NSString
1 2 3 4
| (lldb) e "char" (const char [5]) $5 = "char" (lldb) e @("char") (NSTaggedPointerString *) $6 = 0x8a65d8f551e812f0 @"char"
|
类似特性
1
| #define keypath2(OBJ, PATH) \ (((void)(NO && ((void)OBJ.PATH, NO)), # PATH))
|
通过 OBJ.PATH 实现自动补全