Recomendações para escolher entre funções e macros

A maioria das rotinas de biblioteca em tempo de execução da Microsoft são funções compiladas ou montadas, mas algumas rotinas são implementadas como macros. Quando um arquivo de cabeçalho declara uma função e uma versão de macro de uma rotina, a definição de macro tem precedência, porque ele sempre aparece depois da declaração de função. Quando você invoca uma rotina que é implementada como uma função e uma macro, você pode forçar o compilador a usar a versão da função de duas maneiras:

  • Coloque o nome da rotina entre parênteses.

    #include <ctype.h>
    a = _toupper(a);    // Use macro version of toupper.
    a = (_toupper)(a);  // Force compiler to use
                        // function version of toupper.
    
  • "Indefina" a definição da macro com a diretiva #undef:

    #include <ctype.h>
    #undef _toupper
    

Se você precisa escolher entre uma função e uma implementação de macro de uma rotina de biblioteca, considere as seguintes desvantagens:

  • Velocidade versus tamanho O principal benefício do uso de macros é o tempo de execução mais rápido. Durante o pré-processamento, uma macro é expandida (substituída por sua definição) embutida sempre que é usada. Uma definição de função ocorre apenas uma vez, independentemente de quantas vezes é chamada. As macros podem aumentar o tamanho do código, mas não têm a sobrecarga associada às chamadas de função.

  • Avaliação de função Uma função avalia um endereço, uma macro não. Assim, você não pode usar um nome de macro em contextos que exigem um ponteiro. Por exemplo, você pode declarar um ponteiro para uma função, mas não um ponteiro para uma macro.

  • Verificação de tipo Ao declarar uma função, o compilador pode verificar os tipos de argumento. Como você não pode declarar uma macro, o compilador não pode verificar os tipos de argumento de macro; embora ele possa verificar o número de argumentos que você passa para uma macro.

Confira também

Matemática do tipo genérico
Arquivos .lib de runtime do C (CRT) e Biblioteca Padrão (STL) do C++