Kompilacja programu C – Za Sceną
Preprocesor jest oprogramowaniem systemowym (program komputerowy, który jest przeznaczony do uruchamiania na sprzęcie komputera i programów użytkowych). Wykonuje on wstępne przetwarzanie języka wysokiego poziomu (HLL). Przetwarzanie wstępne jest pierwszym krokiem systemu przetwarzania języka. System przetwarzania języka tłumaczy język wysokiego poziomu na język poziomu maszynowego lub absolutny kod maszynowy (tj. na postać zrozumiałą dla maszyny).
- Preprocesor nie zna reguł zakresu języka C. Dyrektywy preprocesora, takie jak #define, wchodzą w życie natychmiast po ich zobaczeniu i pozostają w mocy do końca pliku, który je zawiera; struktura blokowa programu jest nieistotna.
Preprocesor wykonuje głównie trzy zadania na kodzie HLL :
- Usuwanie komentarzy : Usuwa wszystkie komentarze. Komentarze są pisane tylko po to, aby ludzie mogli zrozumieć kod. Jest więc oczywiste, że są one bezużyteczne dla maszyny. Tak więc, preprocesor usuwa je wszystkie, ponieważ nie są one wymagane w wykonaniu i nie będą również wykonywane.
Tak można zobaczyć plik z usuniętymi komentarzami w linuxie :
Napisz kod C (niech nazwa pliku będzie prog.c). Przetwórz go używając polecenia gcc -E prog.c
Zobaczysz plik wyjściowy z kodem bez komentarzy.
Plik ten jest zapisany z rozszerzeniem ’.i’ (prog.i), który będzie wprowadzony do kompilatora. - Dołączanie plików : Dołączanie wszystkich plików z biblioteki, których potrzebuje nasz program. W HLL piszemy #include, co jest dyrektywą dla preprocesora, która nakazuje mu dołączenie zawartości podanego pliku biblioteki. Na przykład, #include powie preprocesorowi aby włączył całą zawartość pliku biblioteki stdio.h.
Można to również napisać używając podwójnych cudzysłowów – #include „stdio.h”
Uwaga: Jeśli nazwa pliku jest ujęta w nawiasy kątowe, plik jest szukany w standardowych ścieżkach include kompilatora. Jeśli nazwa pliku jest ujęta w cudzysłów, ścieżka wyszukiwania jest rozszerzana do bieżącego katalogu źródłowego. - Rozszerzanie makr : Makra mogą być wywoływane jako małe funkcje, które nie są tak ogólne do przetworzenia. Jeśli musimy napisać funkcję (z małą definicją), która musi być wywołana rekurencyjnie (ponownie i ponownie), to powinniśmy preferować makro zamiast funkcji.
Tak więc, definiowanie tych makr jest wykonywane przez preprocesor.#define SI 1000
jest prostym przykładem makra.
- Istnieją dwa typy makr: Obiektowe (nie przyjmują parametrów) i funkcyjne (Mogą przyjmować parametry)
// object-like macro#define // function-like macro #define ()
- Możesz usunąć definicję makra za pomocą #undef:
// delete the macro# undef
- Możemy napisać makro wieloliniowe takie samo jak funkcja, ale każda instrukcja kończy się znakiem „\”.
#include <stdio.h>
#define MACRO(num, str) {\
printf
(
"%d"
, num);\
printf
(
" is"
);\
printf
(
" %s number"
, str);\
printf
(
"\n"
);\
}
- Istnieją dwa typy makr: Obiektowe (nie przyjmują parametrów) i funkcyjne (Mogą przyjmować parametry)
Ten artykuł został napisany przez Diksha. Jeśli podoba Ci się GeeksforGeeks i chciałbyś wnieść swój wkład, możesz również napisać artykuł używając contribute.geeksforgeeks.org lub wysłać swój artykuł na adres [email protected]. Zobacz, jak twój artykuł pojawia się na stronie głównej GeeksforGeeks i pomóż innym Geekom.