Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Macros variadic são macros do tipo função que contêm um número variável de argumentos.
Comentários
Para usar macros variádicas, as reticências devem ser especificadas como o argumento formal final em uma definição de macro e o identificador de substituição __VA_ARGS__ deve ser usado na definição para inserir os argumentos adicionais. __VA_ARGS__ é substituído por todos os argumentos que correspondem às reticências, incluindo vírgulas entre eles.
O C Standard especifica que pelo menos um argumento deve ser passado às reticências, para garantir que a macro não seja resolvida em uma expressão com uma vírgula à direita. A implementação do C++ da Microsoft tradicional suprime uma vírgula à direita se nenhum argumento for passado às reticências. Quando a opção do compilador /Zc:preprocessor for definida, a vírgula à direita não será suprimida.
Exemplo
// variadic_macros.cpp
#include <stdio.h>
#define EMPTY
#define CHECK1(x, ...) if (!(x)) { printf(__VA_ARGS__); }
#define CHECK2(x, ...) if ((x)) { printf(__VA_ARGS__); }
#define CHECK3(...) { printf(__VA_ARGS__); }
#define MACRO(s, ...) printf(s, __VA_ARGS__)
int main() {
CHECK1(0, "here %s %s %s", "are", "some", "varargs1(1)\n");
CHECK1(1, "here %s %s %s", "are", "some", "varargs1(2)\n"); // won't print
CHECK2(0, "here %s %s %s", "are", "some", "varargs2(3)\n"); // won't print
CHECK2(1, "here %s %s %s", "are", "some", "varargs2(4)\n");
// always invokes printf in the macro
CHECK3("here %s %s %s", "are", "some", "varargs3(5)\n");
MACRO("hello, world\n");
MACRO("error\n", EMPTY); // would cause error C2059, except VC++
// suppresses the trailing comma
}
here are some varargs1(1)
here are some varargs2(4)
here are some varargs3(5)
hello, world
error