Convertiți codul C99 la C89

Cum pot converti c99 codul sursă automat la c89? Vreau să compilez bibliotecile c99 cu Visual C ++, dar MSVC suportă doar c89. Multe modificări sunt doar sintactice, cum ar fi struct inițializatori și ați putea scrie automat un instrument la codul "de-c99". Există acest preprocesor?

8
@PaulR: Cum fac asta? și cu GCC, este posibil și ea? Mulțumiri!
adăugat autor Jack, sursa
Ați putea folosi un compilator modern de la un terț, cum ar fi ICC-ul Intel, care poate fi conectat la Visual Studio.
adăugat autor Paul R, sursa
@Jack: pur și simplu cumperi ICC de la Intel și îl instalezi - o poți folosi în mod autonom și se integrează și în Visual Studio. Unele compilatoare pot funcționa și cu Visual Studio, dar nu cu gcc AFAIK.
adăugat autor Paul R, sursa
Ar fi mai puțin de lucru dacă l-ați compilat ca C ++ în loc ...
adăugat autor K-ballo, sursa
Consultați acest răspuns: stackoverflow.com/a/146419/10077
adăugat autor Fred Larson, sursa
Cred ca motivul pentru a crea C99 a fost exact pentru a evita astfel de "preprocesoare" :) Pentru "viitorul" (da, cu caracter intentionat) - evitati caracteristicile moderne daca folositi vechile unelte.
adăugat autor Viktor Latypov, sursa

3 răspunsuri

Clang pe bază de traduceri sursă-sursă:

https://github.com/libav/c99-to-c89/

5
adăugat

Comeau C/C ++ poate face acest lucru.

Alternativ, utilizați un compilator C adecvat (de exemplu, GCC sau Clang prin intermediul MinGW, Pelles C, Intel) și conectați fișierele obiect rezultate. Cu toate acestea, nu toate acestea (în special MinGW) suportă formatul de depanare Microsoft.

3
adăugat

Ceea ce aveți nevoie este un sistem de transformare a programelor . Un astfel de instrument citește codul sursă, construiește structuri de date compilatoare (cum ar fi arbori de sintaxă abstractă , vă permite să aplica (transformare sursă-sursă) pe acele structuri și apoi poate regenera sursa din structurile de date modificate.

Aveți nevoie de unul care să poată parcurge C99 și să se transforme în C89. Instrumentul pentru Reengineeringul DMS poate face acest lucru folosind (care poate gestiona ambele dialecte ale lui C, inclusiv MSVC 89, precum și Obiective C). Aveți nevoie de un parser matur dacă doriți să faceți acest lucru.

Mulți oameni pot sugera că toate aveți nevoie este un parser C99. Ca o chestiune practică, acest lucru nu este adevărat; pentru a face orice transformări interesante pe limbile de calculator tipice care aveți nevoie de date tabele simbolice, unele fluxuri de date, etc. Pentru mai multe detalii, consultați eseul meu despre Viața după parsare și cum DMS oferă această viață.

Un astfel de aspect este modul în care codificați înlocuirea inițialelor de structuri. S-ar putea să faceți acest lucru prin codul personalizat care merge pe un C99 AST, găsește astfel de inițializatori de structură și hack-uri procedural de copac. Da, asta functioneaza, dar nu este usor si trebuie sa stii o cantitate imensa despre structura copacului. DMS oferă rescrieri sursă-sursă, astfel încât să puteți scrie modele care să recunoască idiomele pe care doriți să le modificați și modele care produc idiomurile rezultate, toate folosind sintaxa de suprafață C.

1
adăugat