preprocessor directives c
Podrobný pohled na direktivy preprocesoru v C ++.
Preprocesor je jedinečná vlastnost C ++. V C ++ máme kroky jako kompilace, propojení a provedení pro typický program. Ve skutečnosti máme v programu C ++ spoustu dalších funkcí, které je třeba zpracovat před předáním programu ke kompilaci.
Za tímto účelem se provádí speciální krok zvaný předzpracování. Předzpracování se provádí před procesem kompilace a předzpracováním speciálních funkcí. Výsledkem je získání rozšířeného programu C ++ a jeho předání kompilátoru.
=> Navštivte zde a dozvíte se C ++ od nuly.
Co se naučíte:
- Přehled
- Směrnice o zařazení souborů
- Směrnice o definici makra
- Směrnice o podmíněné kompilaci
- Operátoři # & ##
- Další směrnice
- Předdefinovaná makra
- Závěr
- Doporučené čtení
Přehled
Speciální funkce pro předzpracování jsou identifikovány pomocí entity zvané „Preprocesorová směrnice“. Tyto direktivy preprocesoru sdělují kompilátoru, že určité informace v programu C ++ označené direktivami preprocesoru je třeba před kompilací preprocesovat.
Všimněte si, že v C ++ začínají všechny direktivy preprocesoru symbolem „#“. V okamžiku, kdy preprocesor (část kompilátoru) narazí na symbol #, informace následující po symbolu # se předzpracovají před předáním programu kompilátoru.
Na rozdíl od ostatních příkazů C ++ direktivy preprocesoru nekončí středníkem.
V tomto kurzu prozkoumáme různé direktivy preprocesoru podporované C ++.
Směrnice o zařazení souborů
#zahrnout
Direktiva pro zahrnutí souborů #include nám umožňuje zahrnout další soubory do našeho zdrojového programu. Pomocí těchto funkcí můžeme do našeho programu zahrnout jakýkoli soubor záhlaví, který obsahuje definice různých předdefinovaných funkcí. Můžeme zahrnout soubory záhlaví do našeho programu pomocí následující syntaxe.
#include
Příklad: #zahrnout
Už jsme to viděli v našich programech C ++. Iostream záhlaví obsahuje funkce potřebné pro streamování vstupních / výstupních dat, jako je cout, cin atd.
Jak se naše programy zvětšují nebo se funkce stávají složitějšími, můžeme chtít náš program rozdělit do různých souborů nebo importovat funkce z ostatních souborů. V tomto případě používáme soubory definované uživatelem. K zahrnutí souborů definovaných uživatelem do našeho programu můžeme použít následující syntaxi směrnice #include.
#include “filename”
Příklad: #include “vector_int.h”
Toto je uživatelsky definovaný soubor záhlaví, který hodláme zahrnout do našeho programu, abychom mohli využívat jeho funkčnost.
Níže uvedený příklad kódu ukazuje použití direktivy #include.
dvojnásobně propojené seznamy c ++
#include using namespace std; int main() { cout<<'This is an example demonstrating inclusion directive #include'; }
Výstup:
Toto je příklad demonstrující zahrnovací směrnici # zahrnout.
Jak je znázorněno, k zahrnutí funkčnosti záhlaví do našeho programu jsme použili direktivu #include.
Směrnice o definici makra
#definovat
Direktiva #define se používá k definování symbolických konstant nebo maker v programu C ++.
Obecná forma směrnice #define je:
#define macro_name replacement code
Když preprocesor narazí na makro v programu, preprocesor nahradí toto makro kódem, který je definován pomocí direktivy #define, než bude kód předán kompilátoru.
Níže uvedený příklad kódu ukazuje symbolickou konstantu RADIUS, která je definována pomocí direktivy #define a jejího použití v programu.
#include #define RADIUS 5 using namespace std; int main() { cout<<'Area of a circle : '<<3.142 * RADIUS * RADIUS; }
Výstup:
Plocha kruhu: 78,55
Jak je znázorněno v programu, můžeme v našem kódu použít symbolickou konstantu RADIUS a bude nahrazen hodnotou pro ni definovanou pomocí direktivy #define.
jak otevírat soubory .swf v systému Windows
Můžeme použít direktivu #define k definování správného funkčního kódu. Tyto funkce jsou obvykle malé funkce.
Níže je uveden příklad.
#include #define REC_AREA(length, breadth) (length * breadth) using namespace std; int main() { int length = 20, breadth = 5, area; area = REC_AREA(length, breadth); cout << 'Area of a rectangle is: ' << area; return 0; }
Výstup:
Plocha obdélníku je: 100
Tady pomocí direktivy #define jsme definovali funkci REC_AREA, která bere dva argumenty, tj. Délku a šířku a vypočítá plochu obdélníku. V hlavní funkci toto makro pouze využijeme a zadáme do něj dva argumenty, abychom získali plochu obdélníku.
#undef
Makra v programu definovaném pomocí direktivy #define trvají, dokud není nedefinována pomocí direktivy #undef. Jakmile program narazí na #undef, následné použití makra (nedefinované #undef) způsobí chybu kompilace.
Pokud ve výše uvedeném programu zadáme po celočíselných deklaracích pouze příkaz #undef REC_AREA, program dá chybu kompilace.
Směrnice o podmíněné kompilaci
Kromě výše vysvětlených směrnic poskytuje C ++ také následující směrnice, které lze použít pro podmíněnou kompilaci kódu. Tyto směrnice lze použít na podobných řádcích příkazu if-else C ++.
Například, můžeme nastavit DEBUG pro program ZAPNUTO nebo VYPNUTO pomocí těchto podmíněných směrnic.
Mezi direktivy podmíněné kompilace poskytované v C ++ patří:
- #li
- #elif
- #endif
- #ifdef
- #ifndef
- #jiný
Níže uvedený program demonstruje použití direktiv podmíněné kompilace v programu C ++.
#include using namespace std; #define DEBUG #define MAX(a,b) (((a)>(b)) ? a : b) int main () { int i, j; i = 100; j = 50; #ifdef DEBUG cout <<'Trace: Start of main function' << endl; #endif cout <<'The maximum is ' << MAX(i, j) << endl; #undef MAX //cout <<'The maximum is ' << MAX(10,20) << endl; #ifdef DEBUG cout <<'Trace: End of main function' << endl; #endif return 0; }
Výstup:
Trasa: Spuštění hlavní funkce
Maximum je 100
Trasa: Konec hlavní funkce
Ve výše uvedeném programu používáme direktivu #ifdef - #endif k definování DEBUG pro program. Potom jsme nedefinovali makro funkci MAX pomocí direktivy #undef. Direktiva podmíněné kompilace vytvoří #ifdef - #endif zkontroluje, zda je nastaven DEBUG a pokud je nastaven, vytiskne v programu několik zpráv.
Operátoři # & ##
Operátory # a ## jsou dva speciální operátory, které se používají k převodu textového tokenu na řetězec, který se má zobrazit, a zřetězení dvou tokenů.
Níže je uveden příklad demonstrující oba tyto operátory.
#include using namespace std; #define MKSTR( x ) #x #define concat(a, b) a ## b int main () { cout <<'MKSTR(Hello World) = '<< MKSTR(Hello World) << endl; int xy = 100; cout <<'concat(x,y) = '< Výstup:
MKSTR (Hello World) = Hello World
concat (x, y) = 100
Ve výše uvedeném programu definujeme MKSTR argumentem x. Má tělo #x. Když tiskneme tento MKSTR pomocí argumentu „Hello World“, vidíme, že kvůli #x je argument převeden na řetězec a je zobrazen na výstupu.
Dále jsme definovali funkci concat se dvěma argumenty a a b. V těle zadáme ## b. Výraz a ## b se rovná ab. Když tedy v hlavní funkci nazýváme concat (x, y), ve skutečnosti se vyhodnotí na xy, což se rovná celočíselné proměnné, kterou jsme definovali.
Další směrnice
#chyba
Obecná syntaxe směrnice #error je:
#error error_message
Když kompilátor narazí na direktivu #error, zobrazí error_message a kompilace se zastaví. Argument error_message může obsahovat jedno nebo více slov s uvozovkami nebo bez nich.
#čára
Toto říká kompilátoru, aby změnil interně uložené číslo řádku a název souboru kompilátoru na dané číslo řádku a název souboru.
#čára sekvence číslic („název souboru“)
Digit_sequence může být celočíselná konstanta.
Příklad:#line 200 test.c
Ve výše uvedeném příkladu je interně uložené číslo řádku nastaveno na 200 a název souboru je změněn na test.c.
#pragma
Dodává kompilátoru pokyny definované implementací. Tyto pokyny jsou specifické pro kompilátor a platformu. Pokud se instrukce neshoduje, je direktiva ignorována bez generování syntaktické chyby.
Předdefinovaná makra
C ++ také definuje řadu předdefinovaných maker, která mohou programátoři používat.
Některá z těchto maker jsou uvedena níže v tabulce.
Předdefinované makro Popis __SOUBOR__ Aktuální název souboru programu, který se kompiluje __DATUM__ Datum překladu zdrojového kódu do objektového kódu ve formátu měsíc / den / rok __ČAS__ Čas ve formě hodina: minuta: sekunda, kdy je program kompilován __ČÁRA__ Aktuální číslo řádku programu, který se kompiluje __cplusplus Celočíselná konstanta, která je definována pro každou verzi kompilátoru
Následující program demonstruje tato makra v programu.
#include using namespace std; int main () { cout<<'__LINE__ :' << __LINE__ << endl; cout<<'__FILE__ :' << __FILE__ << endl; cout<<'__DATE__ :' << __DATE__ << endl; cout<<'__TIME__ :' << __TIME__ << endl; cout<<'__cplusplus:'<<__cplusplus< Výstup:
__LINE__: 5
__FILE__: prog.cpp
__DATE__: 15. dubna 2019
__TIME__: 12: 09: 15
__cplusplus: 201402
Výše uvedený programový výstup odpovídá vysvětlení předdefinovaných maker výše a je samozřejmý.
Závěr
V tomto kurzu jsme viděli různé direktivy preprocesoru poskytované C ++ spolu s jejich příklady. Direktivy preprocesoru nám do jisté míry pomáhají psát efektivnější programy a čitelnější programy.
základní nástroje spojené s řízením rizik jsou
Direktivy podmíněné kompilace nám také umožňují větvit náš programový výstup různými způsoby.
=> Podívejte se na celou sérii školení C ++ zde.
Doporučené čtení
- Testování softwaru Pomoc Partnerský program!
- Psaní a vydělávání - program pro zkušené testery QA
- Výukový program pro Unix Pipes: Pipes v programování Unixu
- Funkce knihovny v C ++
- 70+ NEJLEPŠÍCH C ++ návodů, jak se naučit programování v C ++ ZDARMA
- Argumenty příkazového řádku v C ++
- Iterátory v STL
- Seznamy inicializátoru v C ++