Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: eroare preprocesare - eroare compilare  (Citit de 3245 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
stefan8
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 1



Vezi Profilul
« : Februarie 07, 2015, 22:13:59 »

Salut!

Puteti  sa ma lamuriti si pe mine, va rog, care-i diferenta dintre o eroare de preprocesare si una de compilare? Eventual cu cate un exemplu.

Merci!
Memorat
SebiSebi
Nu mai tace
*****

Karma: 76
Deconectat Deconectat

Mesaje: 306



Vezi Profilul
« Răspunde #1 : Februarie 07, 2015, 23:02:16 »

Atunci cand un program trece de la codul sursa la executabil se parcurg mai multe faze. Prima dintre ele este etapa de preprocesare realizata de un preprocesor. In mare in aceasta etapa se inlocuiesc directivele de preprocesare (e.g. #define) cu valorile lor. De exemplu, daca in cod ai scris ceva de genul
Cod:
#define NMAX 100
int v[NMAX];
el va deveni, dupa preprocesare:
Cod:
int v[100];
, iar directiva va disparea.
Etapa de compilare consta in traducerea codului in limbaj de asamblare care este dependent de arhitectura si de setul de instrucțiuni al procesorului. Erorile de compilare sunt clasice: sintaxa, nu declari variabile, etc. Nu inteleg la ce vrei sa te referi prin eroare de preprocesare.
Memorat
Owlree
Strain
*

Karma: 16
Deconectat Deconectat

Mesaje: 27



Vezi Profilul
« Răspunde #2 : Februarie 08, 2015, 13:15:37 »

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,

Cod:
#include <stdio.h>

int main() {
  
  printf("Hello World!\n");
  
  return 0;
}


este un program valid în C. Dacă, în schimb, am face

Cod:
#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

Cod:
#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:

Cod:
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.

« Ultima modificare: Februarie 09, 2015, 12:36:03 de către Robert Badea » Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines