Подтвердить что ты не робот

Есть ли способ писать макросы с переменным списком аргументов в visual С++?

Насколько я знаю, в gcc вы можете написать что-то вроде:

#define DBGPRINT(fmt...) printf(fmt);

Есть ли способ сделать это в VС++?

4b9b3361

Ответ 1

Да, но только с VС++ 2005. Синтаксис для вашего примера:

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

Полная ссылка здесь.

Ответ 2

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

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

а переменные аргументы для макроса будут переданы функции, представленной как "..." args, где вы можете с помощью wa_args выполнить их анализ.

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

Ответ 3

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

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

Ответ 5

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

Ответ 6

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

#if defined(DETAILED_DEBUG)
#define DBGPRINT fprintf
#else
__forceinline void __DBGPRINT(...){}
#define DBGPRINT __DBGPRINT
#endif

Ответ 7

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

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

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

Ответ 8

Найдите " VA_ARGS" и va_list в MSDN!

Ответ 9

Почти. Это более уродливое, чем это (и вы, вероятно, не хотите, чтобы конечная полуточка в самом макросе:

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

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

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

(отсутствовала пара парен).

Не уверен, почему все негативы, исходный вопрос не указал версию VС++, а переменные макросы не поддерживаются всеми компиляторами.