Zvažte následující kód:
STARTINTEGER n = 5;
PRINT ("Hodnota n je% d", n);
KONEC
Výše uvedený kód není platný kód C.
Ale následující kód je platný:
// Příklad 1.C#define START int main ()
#define END
#define INTEGER int
#define PRINT (A, B) printf (A, B)
START
INTEGER n = 5;
PRINT ("Hodnota n je% d", n);
KONEC
Před kompilací bylo makro START, INTEGER, PRINT a END nahrazeno jejich hodnotou a kód se stal platným C kódem. Můžeme to zkontrolovat pomocí následujícího příkazu:
gcc -E Příklad 1.CTento příkaz se zobrazí po rozbalení všech maker.
Nyní uvidíme různé typy maker:
1. Makra podobná objektům:
Syntax:
#define macro_name macro_value- Makro vždy začíná na #define
- název_makra je uživatelem definovaný název makra
- makro_hodnota je hodnota makra. Může to být cokoli, ale jeden řádek a tělo makra končí s konci tohoto řádku. Na konci nevyžaduje středník (;). Zvažuje se také prostor.
Pokud makro zabírá více než jeden řádek, můžeme to udělat následovně:
# definovat název makra hodnota_makra1 \makro_hodnota2 \
makro_hodnota3
# definovat MAX 200
Toto makro vypadá jako datový objekt, proto se tento typ makra nazývá jako objektové makro.
// Příklad 2.C//#zahrnout
# definovat MAX 200
int main ()
printf ("MAX hodnota je:% d", MAX);
návrat 0;
v Exapmle2.c, MAX je makro. Z výstupu to pozorujeme MAX je nahrazen jeho hodnotou 200.
2. Makra podobná funkcím:
Syntax:
#define název_makra () hodnota_makranázev_makra je uživatelem definované jméno makra. Dvojice závorek musí být vložena za název_makra. Mezi nimi není povolen žádný prostor název_makra a závorky. Můžeme také předat argumenty v tomto typu maker.
#define add (x, y) x + yToto makro vypadá jako volání funkce, proto se tento typ makra nazývá funkční makro.
// Příklad 3.C#define add (x, y) x + y
int main ()
int a;
float b;
a = přidat (4,5);
b = přidat (2.5,3.6)
návrat 0;
V příkladu 3.C, viděli jsme, že na rozdíl od funkce C makro nahradí pouze kód argumenty bez jeho výpočtu. Můžeme tedy předat různé datové typy pomocí stejného makra.
Pokud vložíme mezeru mezi název makra a závorku, funguje to stejně jako objektové makro. Níže to ukazuje C příklad.
// Příklad4.C#define add (x, y) x + y
int main ()
int a;
float b;
a = přidat (4,5);
b = přidat (2.5,3.6)
V příkladu 4.c, viděli jsme, že přidání makra je nahrazeno (x, y) x + y . Stejné jako objektové makro.
3. Makro pro vkládání tokenů:
V jazyce C se pro vkládání tokenů používá operátor ##. Pomocí tohoto operátoru můžeme kombinovat dva platné tokeny do jednoho platného tokenu.
Příklad:
#define MARGE (x, y) x ## y
int main ()
int num = MARGE (52,34);
návrat 0;
Pokud se pokusíme vložit token, který negeneruje platný token, kompilátor C poskytne chybu nebo varování.
// Příklad 6.C#define MARGE (x, y) x ## y
int main ()
int num = MARGE (52, +);
návrat 0;
v Příklad 6.C, máme chybovou zprávu, protože po kombinaci dvou tokenů dostaneme neplatný token '52 + '.
4. Makro pro Stringizing:
V jazyce C se operátor # používá k převodu parametru makra na řetězcovou konstantu. Když operátor # předchází parametru makra, parametr se převede na řetězcový literál. Stringizing lze použít pro objektová a funkční makra.
Příklad:
#define STRINGIZING (x) #x
int main ()
printf (STRINGIZING (Hello World));
návrat 0;
v Příklad 7.C pomocí řetězce STRINGIZING máme řetězec „Hello World“.
Závěr:
Tento článek se dozvěděl o všech typech podobných makrům Objektová makra, Funkčně podobná makra, Makro pro vkládání tokenů, Makro pro Stringizing a Makro pro Stringizing v jazyce C. Nyní můžeme bez jakýchkoli pochyb použít makro v našem programu C.