Rozważ następujący kod:
POCZĄTEKCAŁKOWITA n=5;
PRINT("Wartość n to %d",n);
KONIEC
Powyższy kod nie jest prawidłowym kodem C.
Ale następujący kod jest prawidłowy:
//Przykład 1.do#define START int main()
#define KONIEC
#define INTEGER int
#define PRINT(A,B) printf(A,B)
POCZĄTEK
CAŁKOWITA n=5;
PRINT("Wartość n to %d",n);
KONIEC
Przed kompilacją makra START, INTEGER, PRINT i END zostały zastąpione ich wartością, a kod staje się poprawnym kodem C. Możemy to sprawdzić za pomocą następującego polecenia:
gcc -E Przykład1.doTo polecenie pojawi się po rozwinięciu wszystkich makr.
Teraz zobaczymy różne rodzaje makr:
1. Makra podobne do obiektów:
Składnia:
#define nazwa_makra wartość_makra- Makro zawsze zaczyna się od #define
- macro_name to zdefiniowana przez użytkownika nazwa makra
- macro_value to wartość makra. Może to być wszystko, ale jedna linia i treść makra kończy się końcami tej linii. Nie wymaga średnika (;) na końcu. Rozważana jest również przestrzeń.
Jeśli makro zajmuje więcej niż jedną linię, możemy to zrobić w następujący sposób:
#define nazwa_makra wartość_makra1 \wartość_makra2 \
makro_wartość3
#definiuj MAX 200
To makro wygląda jak obiekt danych, dlatego ten typ makra nazywa się makro podobnym do obiektu.
//Przykład2.do//#zawierać
#definiuj MAX 200
int main()
printf("Wartość MAX to: %d",MAX);
zwróć 0;
W Przykład2.c, MAX jest makro. Z danych wyjściowych obserwujemy, że MAX zostaje zastąpiony przez jego wartość 200.
2. Makra podobne do funkcji:
Składnia:
#define nazwa_makra() wartość_makranazwa_makra to zdefiniowana przez użytkownika nazwa makra. Para nawiasów musi być umieszczona po nazwa_makra. Nie ma odstępów między nazwa_makra i nawiasy. Możemy również przekazywać argumenty w tego typu makrach.
#define dodaj(x,y) x+yTo makro wygląda jak wywołanie funkcji, dlatego ten typ makra nazywa się makro podobnym do funkcji.
//Przykład3.do#define dodaj(x,y) x+y
int main()
int;
pływak b;
a = dodaj(4,5);
b = dodaj(2.5,3.6)
zwróć 0;
W przykładzie3.do, widzieliśmy, że w przeciwieństwie do funkcji C, makro zastępuje tylko kod z argumentami bez obliczania go. Możemy więc przekazać różne typy danych za pomocą tego samego makra.
Jeśli umieścimy spację między nazwą makra a nawiasem, działa to tak samo, jak makro obiektowe. Poniżej C Przykład ilustruje to.
//Przykład4.do#define dodaj (x,y) x+y
int main()
int;
pływak b;
a = dodaj(4,5);
b = dodaj(2.5,3.6)
W przykładzie 4.c, widzieliśmy, że dodawanie makra zostało zastąpione przez (x,y) x+y . To samo, co makro obiektowe.
3. Makro do wklejania tokenów:
W języku C do wklejania tokenów używany jest operator ##. Używając tego operatora możemy połączyć dwa ważne tokeny w jeden ważny token.
Przykład:
#define MARGE(x,y) x##y
int main()
int liczba = MARGE(52,34);
zwróć 0;
Jeśli spróbujemy wkleić token, który nie wygeneruje prawidłowego tokena, kompilator C wyświetli błąd lub ostrzeżenie.
//Przykład6.do#define MARGE(x,y) x##y
int main()
int liczba = MARGE(52;+);
zwróć 0;
W Przykład6.do, mamy komunikat o błędzie, ponieważ po połączeniu dwóch tokenów otrzymujemy nieprawidłowy token '52+'.
4. Makro do tworzenia ciągów:
W języku C operator # służy do konwersji parametru makra na stałą łańcuchową. Gdy operator # poprzedza parametr makra, parametr jest konwertowany na literał ciągu. Ciągi mogą być używane do makr obiektowych i funkcyjnych.
Przykład:
#define STRINGIZING(x) #x
int main()
printf(STRINGIZING(Witaj świecie) );
zwróć 0;
W Przykład 7.do mamy napis „Hello World” za pomocą makra STRINGIZING.
Wniosek:
W tym artykule poznałem wszystkie rodzaje makropodobnych Makra obiektowe, Makra podobne do funkcji, Makro do wklejania tokenów, Makro do tworzenia ciągów i makro do określania ciągów w języku C. Teraz bez żadnych wątpliwości możemy użyć makra w naszym programie C.