Как сделать переменный макрос (переменное количество аргументов)

Я хочу написать макрос в C, который принимает любое количество параметров, а не определенное число

Пример:

#define macro( X )  something_complicated( whatever( X ) )

где X - любое количество параметров

Мне нужно это, потому что whatever перегружен и может быть вызван с 2 или 4 параметрами.

Я попытался определить макрос дважды, но второе определение переписало первый!

Компилятор, с которым я работаю, - g++ (более конкретно, mingw)

Ответ 1

C99, также поддерживаемый компилятором VС++.

#define FOO(fmt, ...) printf(fmt, ##__VA_ARGS__)

Ответ 2

__VA_ARGS__ - стандартный способ сделать это. Не используйте компиляторы, если вам это не нужно.

Меня очень раздражает, что я не могу прокомментировать исходный пост. В любом случае, С++ не является надмножеством C. На самом деле глупо компилировать ваш C-код с помощью компилятора С++. Не делай то, что Донни не делает.

Ответ 3

Я не думаю, что это возможно, вы можете подделать его с помощью двойных парнеров... так же, как долго вам не нужны аргументы индивидуально.

#define macro(ARGS) some_complicated (whatever ARGS)
// ...
macro((a,b,c))
macro((d,e))

Ответ 4

#define DEBUG

#ifdef DEBUG
  #define PRINT print
#else
  #define PRINT(...) ((void)0) //strip out PRINT instructions from code
#endif 

void print(const char *fmt, ...) {

    va_list args;
    va_start(args, fmt);
    vsprintf(str, fmt, args);
        va_end(args);

        printf("%s\n", str);

}

int main() {
   PRINT("[%s %d, %d] Hello World", "March", 26, 2009);
   return 0;
}

Если компилятор не понимает переменные макросы, вы также можете удалить PRINT одним из следующих значений:

#define PRINT //

или

#define PRINT if(0)print

Первые комментарии из инструкций PRINT, вторая предотвращает инструкцию PRINT из-за состояния NULL if. Если оптимизация установлена, компилятор должен исключить неиспользуемые инструкции, например: if (0) print ( "hello world" ); или ((void) 0);

Ответ 5

объясняется для g++ здесь, хотя он является частью C99, поэтому должен работать для всех

http://www.delorie.com/gnu/docs/gcc/gcc_44.html

быстрый пример:

#define debug(format, args...) fprintf (stderr, format, args)