Исключение «va_start используется в функции с фиксированными аргументами»? - PullRequest
2 голосов
/ 23 августа 2011

Я пытаюсь создать простой макрос, используя varargs, но я получаю «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);

Ответы [ 2 ]

5 голосов
/ 23 августа 2011

Тип va_list и связанные с ним операции предназначены для переменных функций .Они не работают с переменными макросами, которые используют __VA_ARGS__ и работают несколько иначе.

В этом примере я не вижу никакой причины использовать макрос;вы, вероятно, должны просто использовать функцию вместо этого.Если окажется, что вам нужен макрос, вам, вероятно, придется передать __VA_ARGS__ в качестве аргументов переменной функции, которая затем может распаковать аргументы и выполнить дальнейшую работу.

1 голос
/ 23 августа 2011

Макросы не являются функциями.На самом деле, они даже не работают , как функции.В частности, они на самом деле не «делают» переменные аргументы.

То есть: когда вы вставляете это в какую-то другую функцию или метод, макрос раскрывается и вставляется текстуально .Если эта функция не имеет список переменных аргументов, начинающийся после того, что вы передали как obj, это просто не сработает.

(Существуют способы заставить макросы «делать» переменные аргументы, но это почти навернякаужасная идея, и почти наверняка нет необходимости.)

...