2010-06-23 15 views
11

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

13

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.

+0

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. –

+10

È possibile eseguire '-Wdeclaration-after-statement -Werror = declaration-after-statement' per trasformarlo in un errore. –

+0

@Matthew: questo è uno snippet che non conoscevo. –

3

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.

+0

L'altra risposta funziona, ma penso che sia probabilmente troppo laboriosa. Mi piace questa risposta meglio. Basta non usare commenti in stile C++. – Omnifarious

+0

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. –

1

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.

+0

'gcc -std = c89' fa ** NOT ** consente commenti in stile C++, quindi questa non è una soluzione praticabile. –

+0

@Paul R: Scusami Paul ho cancellato quella dichiarazione prima di aver postato il commento (e dopo aver letto il tuo post più attentamente). – Clifford

+0

@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++. –

Problemi correlati