2008-09-15 4 views

ответ

24

Да, но только с VC++ 2005. синтаксис ваш пример будет:

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

Полная ссылка here.

-2

Почти. Это уродливее, чем что, хотя (и вы, вероятно, не хотите, завершающую точку с запятой в самом макросе:

#define DBGPRINT(DBGPRINT_ARGS) printf DBGPRINT_ARGS // note: do not use '(' & ')' 

Чтобы использовать его:

DBGPRINT(("%s\n", "Hello World")); 

(пропускал пару скобок).

не знаю, почему все негативы, оригинальный вопрос не сформулирует версию VC++, и VARIADIC макросов не поддерживаются всеми компиляторами.

+0

Persumably в downvotes были потому, что отсутствуют круглые скобки означает, что была сломана ... хотя удивительно, даже более неправильную версию этого наверху есть 5 оборотов. Все вы, люди, пропустили простой `#define DBGPRINT printf` – 2012-10-26 01:17:47

4

Да, вы можете сделать это в Visual Studio C++ в версиях 2005 и выше (не уверен в VS 2003). Взгляните на VA_ARGS. Вы можете в основном сделать что-то вроде этого:

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

и переменные аргументы макроса будет получить передается функции, которая указана как «...» арг, где вы можете нам va_args разобрать их.

Может быть странное поведение с VA_ARGS и использованием макросов. Поскольку VA_ARGS является переменной, это означает, что может быть 0 аргументов. Это может оставить вас в конце запятых, где вы не собираетесь.

+0

VC++ ест конечную запятую, если нет аргументов, не так ли? – 2012-12-14 00:33:19

0

Следующая должны работать (см ссылку Variadic macros.)

(пример ниже показаны фиксированные и переменные аргументы.)

# define DBGPRINTF(fmt,...) \ 
    do { \ 
     printf(fmt, __VA_ARGS__); \ 
    } while(0) 
4

Если вы не хотите использовать нестандартные расширения, вы, чтобы предоставить дополнительные скобки:

#define DBGPRINT(args) printf(args); 
DBGPRINT(("%s\n", "Hello World")); 
+4

Это так неправильно, но все же получил upvotes ... Я бы уволил кого-то за точку с запятой в конце определения в одиночку. То, что вы намеревались: `#define DBGPRINT (args) printf args` ... но для этого случая будет просто` #define DBGPRINT printf`. – 2012-10-26 01:11:01

1

Если вы на самом деле не нужны какие-либо из функций макросов (__FILE__, __LINE__, маркера -распаковка и т. д.), вы можете захотеть написать вариационную функцию, используя stdargs.h. Вместо того, чтобы звонить printf(), переменная функция может вызывать vprintf(), чтобы пройти по спискам переменных аргументов.

1

Для MSVC 7.1 (.NET 2003), это работает:

#if defined(DETAILED_DEBUG) 
#define DBGPRINT fprintf 
#else 
__forceinline void __DBGPRINT(...){} 
#define DBGPRINT __DBGPRINT 
#endif 
Смежные вопросы