Condividi tramite


Suggerimenti per la scelta tra funzioni e macro

La maggior parte delle routine delle librerie run-time di Microsoft è costituita da funzioni compilate o assemblate, ma alcune routine sono implementate come macro. 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. Quando si chiama una routine implementata sia come funzione che come macro, è possibile imporre al compilatore di usare la versione funzione in due modi:

  • Racchiudendo il nome della routine tra parentesi.

    #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:

    #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:

  • Velocità contro dimensioni Il vantaggio principale delle macro è la velocità di esecuzione. Durante la pre-elaborazione, una macro viene espansa (sostituita dalla relativa definizione) inline ogni volta che viene usata. Una definizione di funzione viene eseguita una sola volta indipendentemente dal numero di chiamate. Le macro possono aumentare le dimensioni del codice, ma non hanno il sovraccarico associato alle chiamate di funzione.

  • Valutazione della funzione Una funzione restituisce un indirizzo. Una macro non lo fa. Non è quindi possibile usare un nome di macro nei contesti che richiedono un puntatore. È ad esempio possibile dichiarare un puntatore a una funzione, ma non un puntatore a una macro.

  • Controllo del tipo Quando si dichiara una funzione, il compilatore può controllare i tipi di argomento. Poiché non è possibile dichiarare una macro, il compilatore non può controllare i tipi di argomento macro; anche se può controllare il numero di argomenti passati a una macro.

Vedi anche

Matematica generica di tipo
File C Runtime (CRT) e C++ Standard Library (STL) .lib