Насколько я знаю, в gcc вы можете написать что-то вроде:
#define DBGPRINT(fmt...) printf(fmt);
Есть ли способ сделать это в VС++?
Насколько я знаю, в gcc вы можете написать что-то вроде:
#define DBGPRINT(fmt...) printf(fmt);
Есть ли способ сделать это в VС++?
Да, но только с VС++ 2005. Синтаксис для вашего примера:
#define DBGPRINT(fmt, ...) printf(fmt, __VA_ARGS__)
Полная ссылка здесь.
Да, вы можете сделать это в Visual Studio С++ в версиях 2005 и последующих лет (не уверен в VS 2003). Взгляните на VA_ARGS. Вы можете в основном сделать что-то вроде этого:
#define DBGPRINTF(fmt, ...) printf(fmt, __VA_ARGS__)
а переменные аргументы для макроса будут переданы функции, представленной как "..." args, где вы можете с помощью wa_args выполнить их анализ.
Может быть странное поведение с VA_ARGS и использование макросов. Поскольку VA_ARGS является переменной, это означает, что может быть 0 аргументов. Это может оставить вас в конце запятых, где вы не собираетесь.
Если вы не хотите использовать нестандартные расширения, вы должны предоставить дополнительные скобки:
#define DBGPRINT(args) printf(args);
DBGPRINT(("%s\n", "Hello World"));
То, что вы ищете, называется [variadic macros] (http://msdn.microsoft.com/en-us/library/ms177415(VS.80).aspx).
Краткое описание ссылки: да, с VС++ 2005 по вверх.
Если вам действительно не нужны какие-либо функции макросов (__FILE__
, __LINE__
, token-paste и т.д.), вы можете захотеть написать переменную функцию с помощью stdargs.h
. Вместо вызова printf()
переменная функция может вызывать vprintf()
, чтобы передать списки переменных аргументов.
Для MSVC 7.1 (.NET 2003) это работает:
#if defined(DETAILED_DEBUG)
#define DBGPRINT fprintf
#else
__forceinline void __DBGPRINT(...){}
#define DBGPRINT __DBGPRINT
#endif
Следующее должно работать. (См. Ссылку на Макросы Variadic)
(Пример ниже показывает фиксированные и переменные аргументы.)
# define DBGPRINTF(fmt,...) \
do { \
printf(fmt, __VA_ARGS__); \
} while(0)
Найдите " VA_ARGS" и va_list в MSDN!
Почти. Это более уродливое, чем это (и вы, вероятно, не хотите, чтобы конечная полуточка в самом макросе:
#define DBGPRINT(DBGPRINT_ARGS) printf DBGPRINT_ARGS // note: do not use '(' & ')'
Чтобы использовать его:
DBGPRINT(("%s\n", "Hello World"));
(отсутствовала пара парен).
Не уверен, почему все негативы, исходный вопрос не указал версию VС++, а переменные макросы не поддерживаются всеми компиляторами.