Io lavoro su una base di codice che è principalmente C con un piccolo C++, ed è in gran parte costruita con gcc, ma occasionalmente deve essere costruita con MSVC. Il compilatore C di Microsoft è ancora abbastanza C89 con alcune estensioni minori e ancora non supporta il codice misto e le definizioni di variabili à la C++/C99. Quindi ho bisogno di trovare un modo per impedire agli sviluppatori di scrivere le definizioni di codice/variabile fuori ordine mentre stanno lavorando con gcc, altrimenti la build successivamente si interrompe con MSVC. Se utilizzo gcc -std=c89
, tutto si interrompe perché i commenti in stile C++ non sono consentiti (potrebbero esserci anche altri problemi, ma non ho esaminato ulteriormente questo aspetto). Se io uso gcc -std=gnu89
allora le definizioni di codice/variabile fuori ordine sono permesse, quindi anche questo non aiuta me. Qualche idea ? Suppongo di aver bisogno di qualcosa come gcc -std=c99 -fno-inline-variable-definitions
, se esiste una tale opzione.Come applicare dichiarazioni di variabili in stile C89 in gcc?
risposta
siete dopo le opzioni -Wall
-Wextra
-Wstrict-prototypes
-Wold-style-definition
-Wmissing-prototypes
-Wmissing-declarations
e -Wdeclaration-after-statement
, come descritto sul gcc warnings info page. Si noti che questi possono causare un sacco di rumore dai problemi nei file di intestazione di sistema, e sono solo avvisi in modo da avere una politica di essere desiderosi di avere un build di avviso zero.
Non credo che ci sia un modo per fare ciò che vuoi. Il dialetto C supportato da MSVC è più vicino a C89 rispetto a C99 (ad esempio non supporta neanche gli inizializzatori designati); vuoi davvero qualcosa di più simile alla parola chiave C89-with-C++ - comments-and-inline.
Il problema con che è che i commenti C++ possono influire sulla correttezza del codice C89 valido. Ad esempio, il significato di questa linea cambia sostanzialmente:
int a = 10//* foo */2;
direi che la cosa migliore è di far rispettare C89 nei file di origine C, inclusi i commenti C89-style. inline
è probabilmente OK, però: puoi definirlo su __inline
su gcc.
L'altra risposta funziona, ma penso che sia probabilmente troppo laboriosa. Mi piace questa risposta meglio. Basta non usare commenti in stile C++. – Omnifarious
Sfortunatamente questa è una grande base di codice con molti sviluppatori - fare una ricerca di massa e sostituire i commenti sarebbe un grande sforzo (specialmente tutti i problemi di controllo della sorgente che ne risulterebbero) e gli sviluppatori probabilmente si rivolterebbero se costretto a usare commenti C di vecchio stile. Potrebbero esserci anche altre restrizioni C89 che non potremmo aggirare. Abbiamo * davvero * bisogno di GNU89 o C99, ma senza le dichiarazioni di variabili in stile C++ che causano il fallimento di MSVC. –
Non è Win32 che rende il codice non compilabile, ma il compilatore. È possibile utilizzare GCC on Win32 e ottenere una maggiore compatibilità multipiattaforma.
Un'altra possibilità è utilizzare la compilazione C++ per la build Win32; la compilazione GCC avrà già determinato che è valida C, e la compilazione C++ generalmente renderà anche più forte C.
[modifica] Un'altra soluzione è quella di utilizzare un server di integrazione continua come CruiseControl configurato in modo che ogni volta che il check-nei programmatori piattaforma GCC codice, il server CI può check it out e costruirlo usando VC++ (o anche applicare un strumento di analisi statica di terze parti) e in caso di errore inviate via e-mail i risultati all'utente che ha registrato il codice errato. Questa soluzione potrebbe essere pesante per il problema originale, ma potrebbe anche offrire molti altri vantaggi.
'gcc -std = c89' fa ** NOT ** consente commenti in stile C++, quindi questa non è una soluzione praticabile. –
@Paul R: Scusami Paul ho cancellato quella dichiarazione prima di aver postato il commento (e dopo aver letto il tuo post più attentamente). – Clifford
@Clifford - nessun problema - downvote rimosso. La compilazione C++ non è probabilmente un'opzione, tuttavia dovremmo apportare molte modifiche alla base di codice, ad es. trasmettere il risultato delle chiamate a malloc e gestire molte altre sottili differenze tra C e C++. –
Grazie - Non avevo individuato '-Wdeclaration-after-statement' - che dovrebbe aiutare un po '- ora tutto quello che devo fare è assicurarmi che gli sviluppatori correggano tutti i loro avvertimenti. –
È possibile eseguire '-Wdeclaration-after-statement -Werror = declaration-after-statement' per trasformarlo in un errore. –
@Matthew: questo è uno snippet che non conoscevo. –