Насколько я знаю, в GCC вы можете написать что-то вроде:Есть ли способ написать макросы с переменным списком аргументов в visual C++?
#define DBGPRINT(fmt...) printf(fmt);
Есть ли способ сделать это в VC++?
Насколько я знаю, в GCC вы можете написать что-то вроде:Есть ли способ написать макросы с переменным списком аргументов в visual C++?
#define DBGPRINT(fmt...) printf(fmt);
Есть ли способ сделать это в VC++?
Да, но только с VC++ 2005. синтаксис ваш пример будет:
#define DBGPRINT(fmt, ...) printf(fmt, __VA_ARGS__)
Полная ссылка here.
Почти. Это уродливее, чем что, хотя (и вы, вероятно, не хотите, завершающую точку с запятой в самом макросе:
#define DBGPRINT(DBGPRINT_ARGS) printf DBGPRINT_ARGS // note: do not use '(' & ')'
Чтобы использовать его:
DBGPRINT(("%s\n", "Hello World"));
(пропускал пару скобок).
не знаю, почему все негативы, оригинальный вопрос не сформулирует версию VC++, и VARIADIC макросов не поддерживаются всеми компиляторами.
Да, вы можете сделать это в Visual Studio C++ в версиях 2005 и выше (не уверен в VS 2003). Взгляните на VA_ARGS. Вы можете в основном сделать что-то вроде этого:
#define DBGPRINTF(fmt, ...) printf(fmt, __VA_ARGS__)
и переменные аргументы макроса будет получить передается функции, которая указана как «...» арг, где вы можете нам va_args разобрать их.
Может быть странное поведение с VA_ARGS и использованием макросов. Поскольку VA_ARGS является переменной, это означает, что может быть 0 аргументов. Это может оставить вас в конце запятых, где вы не собираетесь.
VC++ ест конечную запятую, если нет аргументов, не так ли? – 2012-12-14 00:33:19
Что вы ищете называются [VARIADIC макросы] (http://msdn.microsoft.com/en-us/library/ms177415(VS.80).aspx)
Резюме ссылки:.. Да, с VC++ 2005 года до
Следующая должны работать (см ссылку Variadic macros.)
(пример ниже показаны фиксированные и переменные аргументы.)
# define DBGPRINTF(fmt,...) \
do { \
printf(fmt, __VA_ARGS__); \
} while(0)
Поиск "VA_ARGS" и va_list в MSDN!
Если вы не хотите использовать нестандартные расширения, вы, чтобы предоставить дополнительные скобки:
#define DBGPRINT(args) printf(args);
DBGPRINT(("%s\n", "Hello World"));
Это так неправильно, но все же получил upvotes ... Я бы уволил кого-то за точку с запятой в конце определения в одиночку. То, что вы намеревались: `#define DBGPRINT (args) printf args` ... но для этого случая будет просто` #define DBGPRINT printf`. – 2012-10-26 01:11:01
Если вы на самом деле не нужны какие-либо из функций макросов (__FILE__
, __LINE__
, маркера -распаковка и т. д.), вы можете захотеть написать вариационную функцию, используя stdargs.h
. Вместо того, чтобы звонить printf()
, переменная функция может вызывать vprintf()
, чтобы пройти по спискам переменных аргументов.
Для MSVC 7.1 (.NET 2003), это работает:
#if defined(DETAILED_DEBUG)
#define DBGPRINT fprintf
#else
__forceinline void __DBGPRINT(...){}
#define DBGPRINT __DBGPRINT
#endif
Persumably в downvotes были потому, что отсутствуют круглые скобки означает, что была сломана ... хотя удивительно, даже более неправильную версию этого наверху есть 5 оборотов. Все вы, люди, пропустили простой `#define DBGPRINT printf` – 2012-10-26 01:17:47