Előfeldolgozás
A fordítóprogram minden forrásfájl feldolgozását szakaszokban végzi el. Az előfeldolgozás képezi az első szakaszt, amely a fordítási egységet állítja elő. Az előfeldolgozó úgy tekinti a forrásfájlt, mint sorokból álló szöveges fájlt. Megadhatunk direktívákat és makrókat, melyek beszúrnak, törölnek vagy módosítanak sorokat a szöveges fájlban.
A következőkben az előfeldolgozás során végzett műveleteket ismertetjük.
A fordító sorrendben a következő lépéseket hajtja végre:
/*
és */
karaktersorozat
közötti tetszőleges karaktersorozat, kivéve ha nem karakter konstans
vagy string konstans belsejében van) helyettesít egyetlen space
karakterrel.A prepocessing token a leghosszabb karaktersorozat (mohó algoritmus), mely illeszkedik a következő minták valamelyikére:
Néhány helyes szintaxisú szám (csak az előfeldolgozás során):
0 .123 3E
123 123E0F 3e+xy
123LU 0.123E-005 2for1
314 3.14 .314E+1
0xa5 .14E+ 1z2z
Az összes operátor vagy más speciális karakter:
... && -= >= ~ + ; ]
<<= &= -> >> % , < ^
>>= *= /= ^= & - = {
!= ++ << |= ( . > |
%= += <= || ) / ? }
## -- == ! * : [ #
White space karaktert többféle okból használunk, úgymint,
A white space karakter háromféle lehet:
Egy trigraph karaktersorozat 3 karakterből áll,
melyből az első kettő mindig kérdőjel (??
) karakter.
Akkor használjuk ha a megvalósításunkban nem léteznek a bonyolultabb
karakterek. Az összes definiált trigraph karakter:
Character Trigraph
[ ??(
\ ??/
] ??)
^ ??'
{ ??<
| ??!
} ??>
~ ??-
# ??=
Csak és csakis ezek a trigraph karakterek. A fordító minden más esetben nem helyettesíti a dupla kérdőjelet. Vannak fordítók, ahol a trigraph karakterek helyettesítése nem történik meg, vagy opcióval állítható, hogy megtörténjen-e. A szabványos C nyelvben mindig van trigrpah helyettesítés!
Példa:
printf("Case ??=3 is done??/n");
printf("You said what????/n");
helyettesítődik:
printf("Case #3 is done\n");
printf("You said what??\n");
Az include direktíva segítségével beszúrhatunk egy szöveges fájlt a fordítandó forrásprogramba. A szabványos könyvtári függvényekre való hivatkozásokat is így szúrjuk be (<> jelek között). A beszúrandó fájl neve lehet egy már korábban kifejtett define direktíva eredménye is.
__DATE__ "Mmm dd yyyy"
__FILE__ string
__LINE__ decimális int
__STDC__ decimális 1, ha szbványos
C fordító