定义宏预期表达式问题

时间:2012-04-08 21:51:41

标签: objective-c macros c-preprocessor

我想创建一个用于修剪字符串的宏。

我使用下面的代码进行修剪:

[[NSString stringWithString:string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]

但如果我创建如下宏,我会收到错误:期望表达式

#define TRIM_STRING(string) ([[NSString stringWithString:string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]])

如何正确创建相同的定义宏?

2 个答案:

答案 0 :(得分:3)

作为一个宏:

#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。

答案 1 :(得分:2)

摆脱你的开始和结束括号。你有一对太多了。

然后摆脱“NSString stringWithString:string”并将其替换为string。这本身就是错误的,因为你没有用括号括起来,但这是学术上的;无论如何你都不需要复制字符串。

修改

这是一个好主意,因为您的宏的参数在括号中,无论它出现在宏中的哪个位置都放在括号中。这可以避免问题(如果您将复杂表达式指定为参数),因为预处理器会扩展您的宏。