Udostępnij za pośrednictwem


Makra (C/C++)

Preprocesor rozszerza makra we wszystkich wierszach z wyjątkiem dyrektyw preprocesora, wiersze, które mają # jako pierwszy znak inny niż biały znak. Rozszerza ona makra w części niektórych dyrektyw, które nie są pomijane w ramach kompilacji warunkowej. Dyrektywy kompilacji warunkowej umożliwiają pomijanie kompilacji części pliku źródłowego. Testują stałe wyrażenie lub identyfikator, aby określić, które bloki tekstowe mają być przekazywane do kompilatora i które z nich mają być usuwane z pliku źródłowego podczas wstępnego przetwarzania.

Dyrektywa #define jest zazwyczaj używana do kojarzenia znaczących identyfikatorów ze stałymi, słowami kluczowymi i powszechnie używanymi instrukcjami lub wyrażeniami. Identyfikatory reprezentujące stałe są czasami nazywane stałymi symbolicznymi lub stałymi manifestu. Identyfikatory reprezentujące instrukcje lub wyrażenia są nazywane makrami. W tej dokumentacji preprocesora, używany jest jedynie termin „makro”.

Gdy nazwa makra jest rozpoznawana w tekście źródłowym programu lub w argumentach niektórych innych poleceń preprocesora, jest traktowana jako wywołanie tego makra. Nazwa makra jest zamieniana przez kopię ciała makra. Jeśli makro akceptuje argumenty, rzeczywiste argumenty następujące po nazwie makra są zastępowane parametrami formalnymi w ciele makra. Proces zastępowania wywołania makra przetworzoną kopią treści jest nazywany rozszerzeniem wywołania makra.

W praktyce, istnieją dwa typy makr. Makra przypominające obiekty nie przyjmują żadnych argumentów. Makra podobne do funkcji można zdefiniować tak, aby akceptowały argumenty, tak aby wyglądały i działały jak wywołania funkcji. Ponieważ makra nie generują rzeczywistych wywołań funkcji, czasami programy działają szybciej, zastępując wywołania funkcji makrami. (W języku C++funkcje wbudowane są często preferowaną metodą). Jednak makra mogą powodować problemy, jeśli nie zdefiniujesz ich i użyjesz ich z ostrożnością. Może zaistnieć potrzeba użycia nawiasów w definicji makra z argumentami, aby zachować właściwą kolejność w wyrażeniu. Ponadto, makra mogą nie obsługiwać poprawnie wyrażeń z efektami ubocznymi. Aby uzyskać więcej informacji, zobacz getrandom przykład w dyrektywie #define.

Po zdefiniowaniu makra nie można ponownie zdefiniować jej na inną wartość bez uprzedniego usunięcia oryginalnej definicji. Jednakże, można ponownie zdefiniować makro z identyczną definicją. W związku z tym ta sama definicja może pojawić się więcej niż raz w programie.

Dyrektywa #undef usuwa definicję makra. Po usunięciu definicji można ponownie zdefiniować makro na inną wartość. Dyrektywa #define i dyrektywa #undef omawiają #define odpowiednio dyrektywy i#undef.

Aby uzyskać więcej informacji, zobacz,

Zobacz też

Dokumentacja preprocesora języka C/C++