Recomendações para escolher entre funções e macros
A maioria das rotinas de biblioteca de tempo de execução da Microsoft são criadas ou funções montadas, mas algumas rotinas são implementadas como macros. Quando um arquivo de cabeçalho declara uma função e uma versão macro de uma rotina, a definição macro prevalece, porque 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 para usar a versão da função de duas maneiras:
Incluir o nome de 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.
“Undefine” a definição macro com a política de #undef :
#include <ctype.h> #undef _toupper
Se você precisa escolher entre uma função e uma macro implementação de uma rotina de biblioteca, considere o seguinte as compensações:
Speed versus size o principal benefício de usar macros é um tempo de execução mais rápidos. Durante o pré-processamento, uma macro é (substituído por sua definição) embutido expandido cada vez que é usada. Uma definição de função ocorre apenas uma única vez independentemente de quantas vezes é chamada. Macros podem aumentar o tamanho de código mas não têm a sobrecarga associada com as chamadas de função.
A função deFunction evaluation A avaliar um endereço; uma macro não. Portanto você não pode usar um nome macro nos contextos que exigem um ponteiro. Por exemplo, você pode declarar um ponteiro para uma função, mas não um ponteiro para uma macro.
Type-checking quando declara uma função, o compilador pode verificar os tipos do argumento. Como você não pode declarar uma macro, o compilador não pode verificar tipos macro de argumento; embora possa verificar o número de argumentos você passa a uma macro.