Pergunta

Até onde eu sei, no gcc, você pode escrever algo como:

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

Existe uma maneira de fazer isso em VC++?

Foi útil?

Solução

Sim, desde que VC++ 2005.A sintaxe para o seu exemplo seria:

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

Uma referência completa é aqui.

Outras dicas

Sim, você pode fazer isso no Visual Studio C++ em versões 2005 e além (não tenho certeza sobre VS 2003).Dê uma olhada no VA_ARGS.Basicamente, você pode fazer algo como isto:

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

e a variável de argumentos para a macro será passado para a função como '...' args, onde você pode, em seguida, nos va_args para analisá-los fora.

Pode ser estranho comportamento com VA_ARGS e o uso de macros.Porque VA_ARGS é variável, o que significa que não pode ser 0 argumentos.Que pode deixar você com final vírgulas onde você não tinha a intenção.

Se você não quiser usar extensões não padrão, você tem que fornecer extra parênteses:

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

O que você está procurando são chamados [aridade variável macros](http://msdn.microsoft.com/en-us/library/ms177415(VS.80).aspx).

Resumo do link:sim, desde que VC++ 2005 em cima.

Se você realmente não precisa de qualquer um dos recursos de macros (__FILE__, __LINE__, colar token, etc.) você pode querer considerar a escrita de uma função de aridade variável usando stdargs.h.Em vez de chamar printf(), uma função de aridade variável pode chamar vprintf() a fim de passar ao longo de listas de argumentos de variável.

Para MSVC 7.1 (.NET 2003), isso funciona:

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

O seguinte deve funcionar.(Veja o link para Aridade variável macros)

(Exemplo abaixo mostra uma parte fixa e variável de argumentos.)

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

Procure "VA_ARGS"e va_list no MSDN!

Quase.É mais feio do que isso, porém (e você provavelmente não quer um final semi-colon na macro em si:

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

Para utilizar:

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

(ficou faltando um par de parens).

Não sei por que todos os negativos, a pergunta original não o estado a versão do VC++, e aridade variável macros não são suportadas por todos os compiladores.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top