我正在尝试使用varargs创建一个简单的宏,但我得到“va_start在函数中使用固定的args”,我不明白为什么以及我错在哪里。代码如下:
#define FOO(obj, ...) \
va_list args; \
va_start(args, obj); \
NSString *currentObject; \
while ((currentObject = va_arg(args, NSString*)) != nil) { \
NSLog(@"string: %@", currentObject); \
} \
va_end(args);
答案 0 :(得分:5)
va_list
类型及其相关操作适用于可变参数函数。它们不适用于使用__VA_ARGS__
并且工作方式稍有不同的可变参数宏。
在这个例子中,我看不出任何使用宏的理由;你应该只使用一个函数。如果事实证明你确实需要一个宏,你可能最终必须将__VA_ARGS__
作为参数传递给一个可变参数函数,然后可以解包参数并执行进一步的工作。
答案 1 :(得分:1)
宏不是函数。事实上,他们甚至没有像这样的函数。特别是,他们并没有真正“做”变量参数。
即:当您在其他某个函数或方法中插入它时,宏将展开并以文本方式插入。除非该函数有一个变量参数列表,在你传递给obj
的任何内容之后开始,否则就不会这样做。
(有很多方法可以让宏获取“do”变量参数,但这几乎肯定是一个糟糕的主意,而且几乎肯定不是必需的。)