Razmotrite sljedeći kod:
POČETAKCIJELI n = 5;
PRINT ("Vrijednost n je% d", n);
KRAJ
Gornji kod nije valjani C kod.
Ali sljedeći je kod valjan:
// Primjer1.c#define START int main ()
#define END
#define INTEGER int
#define PRINT (A, B) printf (A, B)
POČETAK
CIJELI n = 5;
PRINT ("Vrijednost n je% d", n);
KRAJ
Prije kompilacije, makronaredbe START, INTEGER, PRINT i END zamijenjene su njihovom vrijednošću, a kôd postaje važeći C kod. Možemo provjeriti pomoću sljedeće naredbe:
gcc -E Primjer1.cOva će se naredba prikazati nakon proširenja svih makronaredbi.
Sada ćemo vidjeti različite vrste makronaredbi:
1. Makronaredbe nalik objektima:
Sintaksa:
#define macro_name macro_value- Makronaredba uvijek započinje s #define
- macro_name je korisničko definirano ime makronaredbe
- macro_value je vrijednost makronaredbe. To može biti bilo što, ali jedan redak i tijelo makronaredbe završava s krajevima te linije. Ne zahtijeva točku sa zarezom (;) na kraju. Razmatra se i prostor.
Ako makronaredba zauzima više redaka, možemo to učiniti na sljedeći način:
#define macro_name macro_value1 \makro_vrijednost2 \
macro_value3
#define MAX 200
Ova makronaredba izgleda kao podatkovni objekt, zbog čega se ova vrsta makronaredbe naziva objektnom makronaredbom.
// Primjer2.c// # uključuje
#define MAX 200
int main ()
printf ("MAX vrijednost je:% d", MAX);
return 0;
U Primjer2.c, MAKS je makro. Iz rezultata vidimo da MAKS zamjenjuje se njegovom vrijednošću 200.
2. Makronaredbe nalik funkcijama:
Sintaksa:
#define macro_name () macro_valueime_makronaredbe je korisničko definirano ime makronaredbe. Par zagrada mora se staviti nakon ime_makronaredbe. Nije dopušten prostor između ime_makronaredbe i zagrade. Također možemo prosljeđivati argumente u ovoj vrsti makronaredbi.
#define add (x, y) x + yOva makronaredba izgleda kao poziv funkcije, zato se ova vrsta makronaredba naziva makronaredba nalik funkciji.
// Primjer3.c#define add (x, y) x + y
int main ()
int a;
plutati b;
a = dodaj (4,5);
b = dodaj (2.5,3.6)
return 0;
U Primjeru3.c, vidjeli smo da za razliku od funkcije C, makronaredba zamjenjuje samo kôd argumentima bez izračuna. Dakle, možemo proslijediti različite vrste podataka koristeći istu makronaredbu.
Ako stavimo razmak između naziva makronaredbe i zagrade, to će raditi isto kao makronaredba nalik na objekt. Ispod primjer C to ilustrira.
// Primjer4.c#define add (x, y) x + y
int main ()
int a;
plutati b;
a = dodaj (4,5);
b = dodaj (2.5,3.6)
U primjeru4.c, vidjeli smo da se makronaredba zamjenjuje s (x, y) x + y . Isto kao objektna makronaredba.
3. Makronaredba za lijepljenje tokena:
U jeziku C, operator ## koristi se za lijepljenje tokena. Korištenjem ovog operatora možemo kombinirati dva valjana tokena u jedan važeći žeton.
Primjer:
#define MARGE (x, y) x ## y
int main ()
int num = MARGE (52,34);
return 0;
Ako pokušamo lijepiti tokene koji ne generiraju valjani token, C kompajler daje pogrešku ili upozorenje.
// Primjer6.c#define MARGE (x, y) x ## y
int main ()
int num = MARGE (52, +);
return 0;
U Primjer6.c, imamo poruku o pogrešci jer nakon kombinacije dva tokena dobivamo nevažeći token '52 + '.
4. Makronaredba za nizanje:
U jeziku C, operator # koristi se za pretvaranje parametra makronaredbe u konstantu niza. Kada operator # prethodi parametru makronaredbe, parametar se pretvara u literal niza. Stringiziranje se može koristiti za makronaredbe nalik objektima i funkcijama.
Primjer:
#define STRINGIZING (x) #x
int main ()
printf (STRINGIZING (Pozdrav svijetu));
return 0;
U Primjer7.c dobili smo niz "Hello World" pomoću STRINGIZING makronaredbe.
Zaključak:
Ovaj je članak naučio o svim vrstama makronaredbi Makronaredbe nalik objektima, Makronaredbe nalik funkciji, Makronaredba za lijepljenje tokena, Makronaredba za nizanje i Makronaredba za nizanje na jeziku C. Sada bez ikakve sumnje možemo koristiti makro u našem programu C.