Partilhar via


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

A maioria das rotinas de biblioteca de 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 sempre aparece após a 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.
    
  • "Undefinir a definição da macro com a diretiva #undef."

    #include <ctype.h>
    #undef _toupper
    

Se você precisar escolher entre uma função e uma implementação de macro de uma rotina de biblioteca, considere as seguintes compensações:

  • 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) em linha cada vez 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ções Uma função é avaliada para 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 Quando você declara 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.

Ver também

Matemática genérica de tipos
Ficheiros de tempo de execução de C (CRT) e C++ Standard Library (STL) .lib