Per cominciare, parliamo un po 'del problema. Penso che la causa più probabile del sistema che dà errori su un sistema rispetto all'altro è che il codice non è identico; potresti voler verificare questo tramite qualche strumento o il comando diff
per cercare eventuali modifiche sottili presenti nella tua base di codice. problemi Normalmente, quando ho visto con quel tipo di errore, si hanno qualcosa di simile:
typedef struct Foo* Fooptr;
In un file di intestazione e quindi:
typedef struct Foo
{
int bar;
} *Fooptr;
nel file di origine. Il che significa che puoi semplicemente rilasciare il typedef nella sorgente e dovrebbe essere OK. Solo qualcosa da cercare.
Ora, se è una questione gcc
, una seconda opzione per risolvere il tuo problema, è possibile have multiple versions of gcc on the same computer e poi per specificare l'esatta versione del gcc
a correre con tramite l'opzione -v
. Quindi potrebbe essere una buona idea dare un 4.1.2 alla tua macchina Fedora 18.
Un'altra nota, se si utilizza l'opzione -v
, ma non specificare una versione di gcc
a correre, si otterrà (sull'uscita stderr) i comandi eseguiti per eseguire le fasi di compilazione. Questo potrebbe essere utile per vedere cosa sta succedendo e se ci sono grosse differenze tra ciò che accade su ciascuna macchina.
OK, ora alle vostre domande. Sì, ci sono contrassegni per la compilazione sulla "versione X" di gcc
: Per i principianti c'è lo __VERSION__
Predefined Macro, questo ti restituirà un numero di versione const char *
. Questo può essere molto utile, ma come la documentazione gcc afferma:
Si consiglia di non fare affidamento su suo contenuto, aventi una forma particolare, ma può essere contato su per contenere almeno il numero di release
Nonostante ciò, in genere ho visto solo 1 forma di output da questo che è qualcosa come "4.6.3"
se la mia versione di gcc
è 4.6.3-1ubuntu5
.
Ora, se si sa (o sospetta) che alcuni del codice causerà una particolare versione di gcc
per causare errori è possibile utilizzare i __GNUC__
, __GNUC_MINOR__
e __GNUC_PATCHLEVEL__
macro predefinite per "proteggere" voi stessi:
Ecco un breve snip-it che mostra al più alto livello come usarlo:
#if __GNC__ == 3
printf(“Hello version 3.x.x\n”);
#elif __GNC__ == 4
printf(“Hello version 4.x.x\n”);
#endif
Così il sistema di cui sopra, dove la versione è 4.6.3 che ci si vede il messaggio “Ciao versione 4.xx”. Poi si può ottenere di più avanzato e controllare le sovversioni così:
#if __GNUC__ > 3 || \
(__GNUC__ == 3 && (__GNUC_MINOR__ > 2 || \
(__GNUC_MINOR__ == 2 && \
__GNUC_PATCHLEVEL__ > 0))
printf(“I’m a gcc greater than 3.2.0\n”);
#endif
o la versione più pulita di quella utilizzando la propria macro:
#define GCC_VERSION (__GNUC__ * 10000 \
+ __GNUC_MINOR__ * 100 \
+ __GNUC_PATCHLEVEL__)
#if GCC_VERSION > 30200
printf(“I’m a gcc greater than 3.2.0\n”);
#endif
Per rispondere alla sua domanda circa se diverse versioni di gcc
produrrà diversi errori, sei corretto che in ogni versione di gcc
ci sia ancora qualcosa in più e qualche volta le cose cambiano, quindi vedrai le differenze tra le diverse versioni del compilatore. La soluzione migliore è controllare le note di rilascio per ogni versione tra le due su cui ti trovi. (da 4.1 a 4.7).
non sono sicuro quale architettura di destinazione hai, quindi assicurati di controllare quelle sezioni specifiche in ciascuno dei documenti. Ma penso che tu voglia veramente dare uno sguardo allo "Build system improvements"
e allo "Incompatible changes to the build system"
, che facciano anche una sezione specifica per il codice C che potrebbe essere utile rivedere.
Sì, diversi compilatori/versioni/flag potrebbero produrre risultati diversi, esp. nel codice '# ifdef'-pesante. –
per quanto riguarda "qualsiasi flag che posso impostare per evitare questo in futuro", la mia risposta lo copre, o stavi pensando a qualcosa di diverso? – Mike
alcune informazioni utili sarebbero carine, è più probabile che sia un'intestazione inclusa diversa su un sistema rispetto al compilatore, ma non si menziona mai dove sono channel.h o internal.h o come vengono inclusi. anche le linee circostanti intorno a dove appare channel_t sarebbero utili ... almeno per gli ifdef. Il tuo CFLAG definisce non significa assolutamente nulla senza quello. – technosaurus