Suggerimenti per la scelta tra funzioni e macroRecommendations for Choosing Between Functions and Macros

La maggior parte delle routine delle librerie run-time di Microsoft è costituita da funzioni compilate o assemblate, ma alcune routine sono implementate come macro.Most Microsoft run-time library routines are compiled or assembled functions, but some routines are implemented as macros. Quando un file di intestazione dichiara sia una versione funzione che una versione macro di una routine, la versione macro ha la precedenza, perché viene sempre dopo la dichiarazione di funzione.When a header file declares both a function and a macro version of a routine, the macro definition takes precedence, because it always appears after the function declaration. Quando si chiama una routine implementata sia come funzione che come macro, è possibile imporre al compilatore di usare la versione funzione in due modi:When you invoke a routine that is implemented as both a function and a macro, you can force the compiler to use the function version in two ways:

  • Racchiudendo il nome della routine tra parentesi.Enclose the routine name in parentheses.

    #include <ctype.h>  
    a = _toupper(a);    // Use macro version of toupper.  
    a = (_toupper)(a);  // Force compiler to use   
                        // function version of toupper.  
    
  • "Rimuovendo" la versione macro con la direttiva #undef:"Undefine" the macro definition with the #undef directive:

    #include <ctype.h>  
    #undef _toupper  
    

    Se è necessario scegliere tra l'implementazione come funzione e l'implementazione come macro di una routine di libreria, tenere in considerazione i compromessi seguenti:If you need to choose between a function and a macro implementation of a library routine, consider the following trade-offs:

  • Velocità contro dimensioni Il vantaggio principale delle macro è la velocità di esecuzione.Speed versus size The main benefit of using macros is faster execution time. Durante la pre-elaborazione, una macro viene espansa (sostituita dalla definizione corrispondente) inline ogni volta che viene usata.During preprocessing, a macro is expanded (replaced by its definition) inline each time it is used. Una definizione di funzione viene eseguita solo una volta indipendentemente dal numero di volte in cui viene chiamata.A function definition occurs only once regardless of how many times it is called. Le macro possono aumentare le dimensioni del codice ma non comportano il sovraccarico associato alle chiamate di funzione.Macros may increase code size but do not have the overhead associated with function calls.

  • Valutazione della funzione Una funzione restituisce un indirizzo, una macro no.Function evaluation A function evaluates to an address; a macro does not. Pertanto non è possibile usare un nome di macro in contesti che richiedono un puntatore.Thus you cannot use a macro name in contexts requiring a pointer. È ad esempio possibile dichiarare un puntatore a una funzione, ma non un puntatore a una macro.For instance, you can declare a pointer to a function, but not a pointer to a macro.

  • Controllo del tipo Quando si dichiara una funzione, il compilatore può controllare i tipi di argomento.Type-checking When you declare a function, the compiler can check the argument types. Poiché non è possibile dichiarare una macro, il compilatore non può controllare i tipi di argomenti della macro, anche se può verificare il numero di argomenti passati a una macro.Because you cannot declare a macro, the compiler cannot check macro argument types; although it can check the number of arguments you pass to a macro.

Vedere ancheSee Also

CRT Library Features (Funzionalità della libreria CRT)CRT Library Features