2011-08-23 82 views
2

我想创建一个简单的宏使用可变参数,但我得到“va_start函数使用固定的参数”,我不明白为什么,我错了。该代码是下面的:“va_start在具有固定参数的函数中使用”异常?

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

回答

5

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

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

1

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

也就是说:当您在某些其他功能或方法中插入此宏时,宏将被扩展并以文本方式插入。除非这个函数有一个可变的参数列表,在你以obj传入的值之后开始,否则就不会这样做。

(有些方法可以让宏“执行”可变参数,但它几乎肯定是一个可怕的想法,几乎肯定没有必要。)

相关问题