Iphone 调用宏

Iphone 调用宏,iphone,objective-c,ios,c,Iphone,Objective C,Ios,C,我有以下宏: #define testMethod(a, b) \ if (a.length > b.length) \ return a; \ return b; 当我尝试用以下方式调用它时: NSString *s = testMethod(@"fir", @"sec"); 我得到一个错误: “例外”;“在声明结束时” 为什么?如果是一个语句,而不是一个表达式。它不能返回那样的值 你可能是说: #define testMeth

我有以下宏:

#define testMethod(a, b) \
        if (a.length > b.length) \
            return a; \
        return b;
当我尝试用以下方式调用它时:

NSString *s = testMethod(@"fir", @"sec");
我得到一个错误:

“例外”;“在声明结束时”


为什么?

如果
是一个语句,而不是一个表达式。它不能
返回那样的值

你可能是说:

#define testMethod(a, b) ((a).length > (b).length ? (a) : (b))
右侧参数周围的附加括号很常见,用于防止意外事件发生


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

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

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))

您不需要使用return语句。。。尝试使用以下代码

#define testMethod(a,b)  ((a) < (b) ? (a) : (b))
定义测试方法(a,b)((a)<(b)?(a):(b))

愿这对你有帮助

+1,但还有一个更好的变体:通过使用gcc的
typeof
扩展,您可以首先计算
a
b
一次,然后只计算
}末尾的表达式。