2012-06-11 1 views
7

Можно создать дубликат:
How to make a variadic macro (variable number of arguments)Могу ли я иметь макрос C, который принимает неопределенное количество параметров?

Я хочу, чтобы иметь макрос журнала в основном C, который принимает аргументы, подобные printf и регистрирует их. Однако я хочу, чтобы он регистрировался (уровень журнала, файл vs stderr и т. Д.), Чтобы быть чем-то установленным во время компиляции, а не во время выполнения; при этом метод ничего не делает и, надеюсь, оптимизируется из кода, если я устанавливаю параметры для игнорирования регистрации низкого уровня.

До сих пор у меня есть макрос, который определяется на основе параметра, определенного во время компиляции. Если параметр определен, протоколирование переходит к моему методу журнала (для входа в файлы), в противном случае он переходит в stderr. Тем не менее, я могу передать строку в этот макрос. Метод log способен принимать неопределенное количество аргументов и работает с использованием синтаксиса printf. Я хочу знать, есть ли способ установить мой макрос, чтобы он передавал неопределенное количество аргументов в файл журнала?

И поскольку я подозреваю, что я не могу этого сделать, есть еще один способ достижения того, что я хочу в базовом C (я не могу использовать C++ или boost).

ответ

7

В C99 есть макросы, которые могут принимать переменное количество аргументов. Их называют variadic macros.

http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html

Пример:

#define eprintf(...) fprintf (stderr, __VA_ARGS__) 
#define dfprintf(stream, ...) fprintf(stream, "DEBUG: " __VA_ARGS__) 
2

Да вы можете. C99 поддерживает этот out of the box.

Синтаксис выглядит следующим образом:

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

Смежные вопросы