existe uma maneira de escrever macros com uma lista de argumento variável no visual C++?
-
09-06-2019 - |
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++?
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.