Personalizando parâmetros com macros C
As macros são um aspecto fundamental da programação C, permitindo personalização e flexibilidade do código. Um requisito comum é a capacidade de definir parâmetros opcionais dentro de macros.
Parâmetros opcionais
Considere o exemplo a seguir, onde temos uma macro que imprime uma string:
#define PRINT_STRING(message) PrintString(message, 0, 0)
Esta macro aceita um parâmetro obrigatório, a mensagem para imprimir. Para torná-lo mais versátil, podemos introduzir parâmetros opcionais para o tamanho da string e estilo da fonte:
#define PRINT_STRING_1_ARGS(message) PrintString(message, 0, 0) #define PRINT_STRING_2_ARGS(message, size) PrintString(message, size, 0) #define PRINT_STRING_3_ARGS(message, size, style) PrintString(message, size, style)
Sobrecarga com macros
Para conseguir a sobrecarga, usamos um truque para contar o número de argumentos fornecidos à macro. Em seguida, selecionamos a macro auxiliar apropriada com base nesta contagem de argumentos:
#define GET_4TH_ARG(arg1, arg2, arg3, arg4, ...) arg4 #define PRINT_STRING_MACRO_CHOOSER(...) \ GET_4TH_ARG(__VA_ARGS__, PRINT_STRING_3_ARGS, \ PRINT_STRING_2_ARGS, PRINT_STRING_1_ARGS, )
Uso
Agora podemos usar a macro PRINT_STRING sobrecarregada com parâmetros opcionais:
#define PRINT_STRING(...) PRINT_STRING_MACRO_CHOOSER(__VA_ARGS__)(__VA_ARGS__)
Por exemplo, podemos chamar a macro sem argumentos para imprimir a string padrão:
PRINT_STRING("Hello, World!");
Ou especifique o tamanho da string:
PRINT_STRING("Hello, World!", 18);
Ou o tamanho da string e o estilo da fonte:
PRINT_STRING("Hello, World!", 18, bold);
Essa abordagem simplifica o tratamento de parâmetros para o chamador da macro, melhorando a reutilização e versatilidade do código.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3