Zalecenia dotyczące wybierania pomiędzy funkcjami i makrami

Większość procedur bibliotek uruchomieniowych firmy Microsoft jest kompilowana lub składana, ale niektóre procedury są implementowane jako makra. Gdy plik nagłówka deklaruje zarówno funkcję, jak i wersję makra procedury, definicja makra ma pierwszeństwo, ponieważ zawsze pojawia się po deklaracji funkcji. W przypadku wywoływania procedury implementowanej zarówno jako funkcji, jak i makra, kompilator może wymusić użycie wersji funkcji na dwa sposoby:

  • Ujmij rutynową nazwę w nawiasach.

    #include <ctype.h>
    a = _toupper(a);    // Use macro version of toupper.
    a = (_toupper)(a);  // Force compiler to use
                        // function version of toupper.
    
  • Definicja makra "Undefine" z dyrektywą #undef :

    #include <ctype.h>
    #undef _toupper
    

Jeśli musisz wybrać między funkcją a implementacją makr procedury biblioteki, rozważ następujące kompromisy:

  • Szybkość i rozmiar Główną zaletą korzystania z makr jest krótszy czas wykonywania. Podczas przetwarzania wstępnego makro jest rozszerzane (zastępowane jego definicją) wbudowane za każdym razem, gdy jest używane. Definicja funkcji występuje tylko raz, niezależnie od tego, ile razy jest wywoływana. Makra mogą zwiększyć rozmiar kodu, ale nie mają obciążenia związanego z wywołaniami funkcji.

  • Ocena funkcji Funkcja funkcja oblicza adres; makro nie. W związku z tym nie można użyć nazwy makra w kontekstach wymagających wskaźnika. Można na przykład zadeklarować wskaźnik do funkcji, ale nie wskaźnik do makra.

  • Sprawdzanie typów Podczas deklarowania funkcji kompilator może sprawdzić typy argumentów. Ponieważ nie można zadeklarować makra, kompilator nie może sprawdzić typów argumentów makra; chociaż może sprawdzić liczbę argumentów przekazywanych do makra.

Zobacz też

Matematyka ogólna typu
Pliki C runtime (CRT) i C++ Standard Library (STL) .lib