Etapa de preprocesare e cea în care se analizează liniile ce încep cu
# ca și directive. O directivă este o instrucțiune care specifică cum ar trebui să acționeze compilatorul / assemblerul. O eroare de preprocesare este o eroare pe una din aceste linii.
Spre exemplu,
#include <stdio.h>
int main() {
printf("Hello World!\n");
return 0;
}
este un program valid în C. Dacă, în schimb, am face
#include <not_a_file.h>
int main() {
printf("Hello World!\n");
return 0;
}
am obține o eroare la faza de preprocesare pe motiv că nu s-a putut găsi fișierul
not_a_file.h.
Erorile de preprocesare nu trebuie neapărat să fie neintenționate, spre exemplu
#include <stdio.h>
#if (__STDC_VERSION__ != 201112L)
#error C11 or later required.
#endif
int main() {
printf("Hello World!\n");
return 0;
}
spune că noi nu vrem să compilăm decăt cu standardul C11 sau mai nou. Făcând
gcc -std=c99 test.c vom obține iarăși o eroare în faza de preprocesare care ne transmite mesajul scris de noi pe linia cu
#error. Pe de altă parte,
gcc -std=c11 test.c va funcționa fără probleme.
Se pot face destul de multe lucruri interesante cu aceste directive.
Erorile de compilare sunt cele care au loc în timp ce compilatorul încearcă să traducă codul tău în alt limbaj (în cazul nostru, din C în limbaj de asamblare). Cum s-a zis și mai sus, acestea sunt, de obicei, cele „clasice”. Pot apărea însă, mai rar, erori și în compilator (internal
compiler error). Următorul fragment este luat de pe Wikipedia:
somefile.c:1001: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://bugs.gentoo.org/> for instructions.