Domanda

Sono abituato a vecchio stile C ed e hanno appena iniziato ad esplorare le caratteristiche C99. Ho solo una domanda: Il mio programma di compilare correttamente se uso C99 nel mio programma, la bandiera C99 con gcc e collegarlo con le precedenti librerie C99

?

Quindi, dovrei aderire al vecchio C89 o evolvere?

È stato utile?

Soluzione

Credo che siano compatibili a tale riguardo. Questo è il tempo che la roba che si sta compilando contro non si attiva su una delle nuove chicche. Per esempio, se il vecchio codice contiene enum bool { false, true }; allora sei nei guai. Come un dinosauro simile, mi sto lentamente abbracciare il meraviglioso nuovo mondo di C99. Dopo tutto, è stato solo là fuori in agguato per circa 10 anni a questa parte;)

Altri suggerimenti

Si dovrebbe evolversi. Grazie per l'ascolto: -)

In realtà, mi spieghi questo.

Hai ragione che C99 è stato intorno per un bel po '. dovrebbe (a mio parere) sia utilizzando tale standard per qualcosa di diverso codice legacy (dove basta correggere i bug piuttosto che aggiungere nuove funzioni). E 'probabilmente non vale la pena per codice legacy, ma si dovrebbe (come per tutte le decisioni aziendali) fare la propria analisi costi / benefici.

Sono già assicurare il mio nuovo codice è compatibile con C1X - mentre io non sto utilizzando una delle nuove funzionalità ancora, cerco di fare in modo che non si romperà

.

Per quanto riguarda ciò che il codice di guardare fuori per, degli standard autori prendono retrocompatibilità molto sul serio. Il loro lavoro non era mai di progettare un nuovo linguaggio, è stato quello di codificare pratiche esistenti.

La fase che sono in questo momento permette loro un po 'di latitudine nell'aggiornare la lingua, ma che ancora seguono il giuramento di Ippocrate in termini di loro produzione:. "Prima di tutto, non nuocere"

In generale, se il codice è rotto con un nuovo standard, il compilatore è costretto a dirti. Quindi è sufficiente compilare il vostro codice di base sarà un ottimo inizio. Tuttavia, se si legge la C99 documento razionale , vedrete la frase "cambiamento tranquillo" appaiono -. questo è ciò che è necessario fare attenzione per

Si tratta di cambiamenti comportamentali nella compilatore che non c'è bisogno di essere informati circa e può essere la fonte di gran angoscia e stridore di denti se l'applicazione comincia ad agire strano. Non preoccuparti per il "cambiamento tranquillo nel C89" bit -. Se fossero un problerm, si sarebbe già stato morso da loro

Tale documento, tra l'altro, è un eccellente lettura per capire il motivo per cui lo standard attuale dice quello che dice.

Con rispetto:. Prova e scoprire :-)

Anche se, di tenere presente che, anche se è necessario fissare alcuni Minior compilazione differenze, salendo è probabilmente vale la pena.

Se non violare le caratteristiche esplicite C99, un codice C90 funzionerà benissimo bandiera C99 con un altro precedenti librerie C99.

Ma ci sono alcune cose da librerie basate in C89 come ,, che di certo non funzionerà.

C99 è molto flessibile, quindi sentitevi liberi di migrare: -)

Le convenzioni di chiamata tra le librerie C non è cambiata nei secoli, e in effetti, non sono sicuro che mai ha.

I sistemi operativi a questo punto fanno molto affidamento sulle convenzioni di chiamata C in quanto le API C tendono ad essere il collante tra i pezzi del sistema operativo.

Quindi, in sostanza la risposta è "Sì, i binari sarà retrocompatibile. No, naturalmente, il codice utilizzando le funzionalità C99 non può successivamente essere compilato con un compilatore non-C99."

E 'destinato ad essere compatibile. Si formalizza le estensioni che molti fornitori hanno già implementate. E 'possibile, forse anche probabile, che un programma ben scritto non avrà problemi quando si compila con C99.

Nella mia esperienza, la ricompilazione alcuni moduli e non altre, per risparmiare tempo ... rifiuti un sacco di tempo. Di solito c'è qualche facilmente trascurata dettaglio che ha bisogno il nuovo compilatore per rendere il tutto compatibili.

Ci sono alcune parti del C89 standard, che sono scritti in modo ambiguo, e seconda di come si interpreta la regola sui tipi di puntatori e gli oggetti che stanno di accesso, lo Standard possono essere visti come descrivere una delle due lingue molto diverse --one dei quali è semanticamente molto più potente e di conseguenza utilizzabile in una vasta gamma di settori, e una delle quali permette maggiori opportunità per l'ottimizzazione del compilatore-based. Il C99 Standard "chiarito" la regola per mettere in chiaro che non fa nessuno sforzo per affidare la compatibilità con l'ex di lingua, anche se è stato schiacciante favorito in molti campi; si tratta anche come definito alcune cose che sono stati definiti nel C89, ma solo perché le regole C89 non sono stati scritti con sufficiente precisione per proibire loro (ad esempio l'uso di memcpy per il tipo di giochi di parole nei casi in cui la destinazione ha una durata heap).

C99 può quindi essere compatibile con il linguaggio che i suoi autori pensato è stato descritto da C89, ma non è compatibile con il linguaggio che è stato elaborato dalla maggior parte dei compilatori C89 tutto il 1990.

Alcune funzioni C89 non sono validi C99

Si può sostenere che queste caratteristiche esistono solo per ragioni storiche, e non deve essere utilizzato nel codice C89 moderna, ma esistono.

Il C99 N1256 standard draft Premessa paragrafo 5 paragona C99 a vecchie revisioni, ed è un buon punto di partenza alla ricerca di quelle incompatibilità, anche se ha di gran lunga più estensioni di restrizioni.

implicita int di ritorno e tipi di variabili

Citato da Lutz in un commento, ad esempio, i seguenti sono C89 valida:

static i;
f() { return 1; }

ma non C99, in cui si deve scrivere:

static int i;
int f() { return 1; }

Questo preclude anche funzioni senza prototipi chiamando in C99: sono prototipi necessari per tutte le funzioni di C89, C90 o C99?

n1256 dice:

  

rimuovere int implicito

Ritorna senza espressione per la funzione non vuoto

Valido C89, C99 non valida:

int f() { return; }

Credo che in C89 che restituisce un valore di implementazione definito. n1256 dice:

  

ritorno senza espressione non consentita in funzione che restituisce un valore

Divisione intera all'operando negativo

  • C89: giri per una direzione definita implementazione
  • C99: giri per 0

Quindi, se il compilatore arrotondato al -inf, e si è basata su tale implementazione definito il comportamento, il compilatore è ora costretto a rompere il codice su C99.

https://stackoverflow.com/a/3604984/895245

n1256 dice:

  

divisione di interi affidabile

compatibilità con Windows

Una delle principali preoccupazioni pratica è essere in grado di compilare in Windows, dal momento che Microsoft fa non intendono attuare pienamente C99 troppo presto .

Questo è per esempio il motivo per cui libgit2 limiti consentiti C99 dispone .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top