【问题标题】:Define macro expected expression issues定义宏预期表达式问题
【发布时间】:2012-04-08 21:51:40
【问题描述】:
我想创建一个宏来修剪我的字符串。
我使用下面的代码进行修剪:
[[NSString stringWithString:string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]
但是如果我创建如下宏,我会得到一个错误:expected expression
#define TRIM_STRING(string) ([[NSString stringWithString:string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]])
如何正确创建相同的定义宏?
【问题讨论】:
标签:
objective-c
macros
c-preprocessor
【解决方案1】:
作为一个宏:
#define TRIM_STRING(string) [(string) stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]
但是,这里确实没有理由不使用内联函数。你得到类型检查,编译器会给你一些有意义的错误信息。和内联函数一样:
NSString * NSStringTrim(NSString *string)
{
return [string stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
或者,更好的是,为此在 NSString 上创建一个类别:
@interface NSString (additions)
- (NSString *)stringByTrimmingWhitespace;
@end
@implementation NSString (additions)
- (NSString *)stringByTrimmingWhitespace
{
return [self stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
@end
这样你就得到了命名空间,你可以通过做来调用它
[string stringByTrimmingWhitespace]
更整洁,更符合Cocoa。
【解决方案2】:
去掉你的开始和结束括号。你的一对太多了。
然后把“NSString stringWithString:string”去掉,换成string。这本身就是错误的,因为您没有将它放在括号中,但它是学术性的;无论如何,您都不需要复制字符串。
编辑:
这是一个好主意,因为您对宏的参数在括号中,所以将它放在宏中出现的任何位置的括号中。这可以避免预处理器扩展宏时出现问题(如果您将复杂的表达式指定为参数)。