Как сделать вариативный макрос (переменное количество аргументов)
Я хочу написать макрос в C, который принимает любое количество параметров, а не конкретное число
пример:
#define macro( X ) something_complicated( whatever( X ) )
здесь X - это любое количество параметров
мне это нужно, потому что whatever перегружен и может быть вызван с 2 или 4 параметрами.
Я попытался определить макрос дважды,но второе определение переписало первое!
компилятор, с которым я работаю, - это g++ (более конкретно, mingw)
5 ответов:
__VA_ARGS__Это стандартный способ сделать это. Не используйте специфические для компилятора хаки, если вам это не нужно.Я очень раздражен, что не могу прокомментировать оригинальный пост. В любом случае, C++ не является надмножеством C. действительно глупо компилировать свой код C с помощью компилятора C++. Не делай того, что не делает Донни.
Я не думаю, что это возможно, вы могли бы поддельные его с двойной скобкой ... до тех пор, пока вам не нужны аргументы по отдельности.
#define macro(ARGS) some_complicated (whatever ARGS) // ... macro((a,b,c)) macro((d,e))
#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; }если компилятор не понимает вариативные макросы, вы также можете удалить печать с помощью любого из следующих действий:
#define PRINT //или
#define PRINT if(0)printпервый комментирует инструкции по печати, второй предотвращает инструкцию по печати из-за условия NULL if. Если оптимизация установлена, компилятор должен удалить никогда не выполняемые инструкции, такие как: if(0) print("hello world"); или ((void)0);
объяснил для g++ здесь, хотя он является частью C99, поэтому должен работать для всех
http://www.delorie.com/gnu/docs/gcc/gcc_44.html
пример:
#define debug(format, args...) fprintf (stderr, format, args)
Comments