我有以下宏:
#define testMethod(a, b) \
if (a.length > b.length) \
return a; \
return b;
当我尝试用以下方式调用它时:
NSString *s = testMethod(@"fir", @"sec");
我收到一个错误:
"Excepted ";" at end of declaration"
为什么?
我有以下宏:
#define testMethod(a, b) \
if (a.length > b.length) \
return a; \
return b;
当我尝试用以下方式调用它时:
NSString *s = testMethod(@"fir", @"sec");
我收到一个错误:
"Excepted ";" at end of declaration"
为什么?
if
是语句,不是表达式。它不能return
有这样的价值。
你可能的意思是:
#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))
这可能会帮助你..