调用一个宏

时间:2012-07-04 12:37:36

标签: iphone objective-c ios c

我有以下宏:

#define testMethod(a, b) \
        if (a.length > b.length) \
            return a; \
        return b;

当我尝试用它来调用它时:

NSString *s = testMethod(@"fir", @"sec");

我收到错误:

  

"Excepted ";" at end of declaration"

为什么?

3 个答案:

答案 0 :(得分:7)

if是一个陈述,而不是表达。它不能return这样的值。

你可能意味着:

#define testMethod(a, b) ((a).length > (b).length ? (a) : (b))

右侧参数的额外括号很常见,可以保护您免受意外的与优先级相关的事件的影响。

另请注意,由于上述内容是通过文本替换进行预处理的,因此可能会构造比等效函数更多的对象。

答案 1 :(得分:3)

如果要在表达式中使用宏,则应将其定义为表达式本身,而不是一组语句。最终会出现语法错误,因为宏实际上是替换的,并且在另一个语句中不允许使用语句。

GCC有一个名为“语句表达式”的扩展,可以帮助您实现这一目标,但它是非标准的:

#define testMethod(a, b) ({ \
    typeof(a) result = (a).length > (b).length ? (a) : (b); \
    result; \
})

实际上,在您的情况下,这些都不是必需的,因为语句可以很容易地转换为表达式:

#define testMethod(a, b) ((a).length > (b).length ? (a) : (b))

答案 2 :(得分:0)

您无需使用return语句...尝试使用以下代码

#define testMethod(a,b)  ((a) < (b) ? (a) : (b))

这可能会对你有所帮助..