“在固定args函数中使用的va_start”异常?

时间:2011-08-23 11:04:58

标签: objective-c xcode macros c-preprocessor

我正在尝试使用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);

2 个答案:

答案 0 :(得分:5)

va_list类型及其相关操作适用于可变参数函数。它们不适用于使用__VA_ARGS__并且工作方式稍有不同的可变参数宏。

在这个例子中,我看不出任何使用宏的理由;你应该只使用一个函数。如果事实证明你确实需要一个宏,你可能最终必须将__VA_ARGS__作为参数传递给一个可变参数函数,然后可以解包参数并执行进一步的工作。

答案 1 :(得分:1)

宏不是函数。事实上,他们甚至没有像这样的函数。特别是,他们并没有真正“做”变量参数。

即:当您在其他某个函数或方法中插入它时,宏将展开并以文本方式插入。除非该函数有一个变量参数列表,在你传递给obj的任何内容之后开始,否则就不会这样做。

(有很多方法可以让宏获取“do”变量参数,但这几乎肯定是一个糟糕的主意,而且几乎肯定不是必需的。)