Makra (C/C++)
Wstępne przetwarzanie rozszerza makra we wszystkich wierszach, które nie są dyrektywami preprocesora (wiersze, które nie mają # jako pierwszego znaku nie będącego znakiem białym) i w części niektórych dyrektyw, które nie są pomijane jako część kompilacji warunkowej. Dyrektywy "kompilacji warunkowej" pozwalają na pomijanie kompilacji części pliku źródłowego przez testowanie wyrażenia stałego lub identyfikatora służącego do określania bloków tekstu, które są przekazywane do kompilatora i bloków tekstu, które są usuwane z pliku źródłowego podczas przetwarzania wstępnego.
Dyrektywa #define jest zazwyczaj używana do skojarzenia znaczących identyfikatorów ze stałymi, słowami kluczowymi i powszechnie używanymi instrukcjami lub wyrażeniami.Identyfikatory, które reprezentują stałe są czasami nazywane "stałymi symbolicznymi" lub "stałymi manifestu". Identyfikatory, które reprezentują instrukcje lub wyrażenia są nazywane "makrami". W tej dokumentacji preprocesora, używany jest jedynie termin "makro".
Po rozpoznaniu nazwy makra w tekście źródłowym programu lub w argumentach niektórych innych poleceń preprocesora, jest ona traktowana jako wywołanie tego makra.Nazwa makra jest zamieniana na 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 zamieniania wywołania makra przetworzoną kopią ciała nazywa się "rozszerzeniem" wywołania makra.
W praktyce, istnieją dwa typy makr. "Obiektopodobne" makra nie przyjmują żadnych argumentów, tymczasem "funkcjopodobne" makra można zdefiniować tak, aby przyjmowały argumenty tak, aby wyglądały i zachowywały się jak wywołania funkcji.Ponieważ makra nie generują rzeczywistych wywołań funkcji, można czasami przyspieszyć działanie programów zamieniając wywołania funkcji na makra. (W języku C++, funkcje wbudowane są często metodą preferowaną). Jednakże makra mogą tworzyć problemy, jeśli nie będą zdefiniowane i używane ostrożnie.Może istnieć 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.Zobacz przykład getrandom w Dyrektywa #define, aby uzyskać więcej informacji.
Po zdefiniowaniu makra nie można przedefiniować go na inną wartość, bez usuwania oryginalnej definicji.Jednakże, można ponownie zdefiniować makro z dokładnie tą samą definicją.W efekcie ta sama definicja może się pojawić w programie więcej niż jeden raz.
Dyrektywa #undef usuwa definicję makra.Po usunięciu definicji, można ponownie zdefiniować makro z inną wartością.W artykułach dyrektywa #define i dyrektywa #undef omówiono odpowiednio dyrektywy #define i #undef.
Aby uzyskać więcej informacji, zobacz,