【问题标题】: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。这本身就是错误的,因为您没有将它放在括号中,但它是学术性的;无论如何,您都不需要复制字符串。

      编辑:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-27
        • 2015-11-18
        相关资源
        最近更新 更多