Objective c 预处理器不允许宏中的令牌中的“:”定义属性
我创建了一个宏来定义字符串属性Objective c 预处理器不允许宏中的令牌中的“:”定义属性,objective-c,xcode,clang,c-preprocessor,selector,Objective C,Xcode,Clang,C Preprocessor,Selector,我创建了一个宏来定义字符串属性 #define STRING_PREF(NAME) \ @property (nonatomic, strong, getter=NAME, setter=set_##NAME##:) NSString * NAME; 我试着这样使用它: STRING_PREF(username) 但最终会出现以下错误: error: pasting formed 'set_username:', an invalid preprocessing token STRING_
#define STRING_PREF(NAME) \
@property (nonatomic, strong, getter=NAME, setter=set_##NAME##:) NSString * NAME;
我试着这样使用它:
STRING_PREF(username)
但最终会出现以下错误:
error: pasting formed 'set_username:', an invalid preprocessing token
STRING_PREF(username)
^
foo.h:16:62: note: expanded from macro 'STRING_PREF'
@property (nonatomic, strong, getter=NAME, setter=set_##NAME##:) NSString * NAME;
^
1 error generated.
无法使用预处理器生成选择器名称吗?请不要粘贴:,如下所示:
#define STRING_PREF(NAME) @property (nonatomic, copy, getter=NAME, setter=set_##NAME:) NSString *NAME;
还要注意,字符串应该定义为复制属性,而不是强属性。字符串应该定义为复制属性,而不是强属性,真的吗?为什么?找不到任何文档表明这一点。@QwertyBob仅仅是因为NSString有一个可变子类,您永远不知道是否以可变字符串而不是不可变字符串传递,并且字符串可能会在未经通知的情况下更改。尽管本文使用了旧的弧前保留/释放术语,但对其进行了很好的解释: