Domanda

In diverse compilatori ho usato (tutti gcc ma varie versioni) ottengo un errore di C99 mode per cose come dichiarare int i all'interno del ciclo for espressione invece di prima (se io non uso l'opzione std=c99). Dopo aver letto qui ho capito che le opzioni gcc -ansi, -std=c89 e -std=iso9899:1990 tutto valutare allo standard ANSI C, ma io non capisco perché / se devo scegliere il livello c89 rispetto a uno standard più recenti come c99 (che è la più recente presumo).

Inoltre, non vedo più versioni degli standard di tipo iso per il linguaggio C, il primo dei quali (dalla mia comprensione) è una porta diretta dello standard ANSI. è sicuro di dire che iso aggiornerà il loro standard per C, ma lo standard ANSI originale per C sarà sempre lo stesso?

Domanda bonus:

I può effettivamente capire questo fuori me stesso, io non ho avuto il tempo di farlo ancora, quindi se qualcuno sa la parte superiore della testa allora che è grande, altrimenti non disperatevi, io capirlo tardi:)

Ho un abbastanza nuovo di stampa del libro The C Programming Language (ANSI). Il mio libro sempre spettacoli per i loop come questo:

int i;

for(i = 0; i < foo; i++)

ma molte persone (la maggior parte che hanno più talento di programmazione nel loro piccolo dito) scrivere il loro cicli for in questo modo:

(int i = 0; i < foo; i++)

E 'corretto dire se scrivo il ciclo il primo modo poi i deve essere accessibile a tutta la funzione, ma se scrivo che il secondo modo, allora i è accessibile solo per il ciclo for A PRESCINDERE di quello che ho compilazione di serie con? Un altro modo di porre questa stessa domanda, se compilo alla norma c89 intende la i di entrambi per cicli essere accessibile l'intera funzione e se compilo alla norma c99 intende la i del primo ciclo accessibili a tutta la funzione mentre il i del secondo ciclo for sarà accessibile solo dal ciclo for?

È stato utile?

Soluzione

  

Non capisco perché / se mi conviene   scegliere lo standard C89 rispetto a una più recente   standard come C99 (che è il più nuovo   Presumo).

Un paio di motivi:

Supporto C99 del 1) gcc non è abbastanza completo, mentre il suo sostegno C89 è. Ecco perché C89 (con estensioni GNU) è l'impostazione predefinita. Quindi, se sei un accanito sostenitore assoluto per la programmazione a uno standard utilizzando gcc, raccogliere C89.

2) il compilatore di Microsoft in realtà non supporta C99 a tutti. Quindi, se volete scrivere codice C portabile, C89 è uno standard comune.

  

Is è sicuro di dire che iso aggiornerà   il loro standard per C ma l'originale   standard ANSI per il C sarà sempre il   stesso?

No, ISO C99 è stato anche ratificato come standard ANSI. Il nome "ANSI" che sia collegata a C89 è solo un incidente storico sfortunato. Detto questo, C89 C89 sarà sempre, non è solo la recente norma più ANSI C.

  

E 'corretto dire se scrivo la   cappio il primo modo poi i dovrebbe essere   accessibili per l'intera funzione, ma   se scrivo che il secondo modo, allora i è   accessibile solo al ciclo for   Indipendentemente da ciò che ho compilazione di serie   con?

Non è possibile scrivere il secondo modo in C89 (vale a dire con -pedantic di aderire allo standard), quindi non c'è "indipendentemente da ciò che standard". Le versioni di C con le estensioni GNU non sono standard, sono "dialetti" (almeno questo è quello che la pagina man li chiama). Nella C89 secondo ciclo non è legale, in C99 il secondo limita il campo di applicazione i alla rete. Ovviamente in entrambi i casi, il primo ciclo dà i una portata più ampia.

In realtà, gcc non piace il secondo anello di C89 anche con le estensioni GNU abilitati.

Altri suggerimenti

C è stato standardizzato come C89 da ANSI. E 'stato poi standardizzato da ISO come C90; non ci sono differenze tecniche tra C89 e C90.

C99 è una revisione dello standard C; è stato sviluppato dal comitato ISO C e standardizzata sia da ISO e ANSI. Sia C89 e C99 sono gli standard ANSI. Nel linguaggio comune, la frase "ANSI C" di solito si riferisce a C89; il K & R 2a ed. Copertine di libri solo C89, C99 non.

Perché si sceglie di utilizzare una vecchia versione di C? Beh, ci sono almeno due ragioni. In primo luogo, si può avere un compilatore che non supporta C99 (per esempio, Microsoft Visual C ++ supporta solo C89). In secondo luogo, c'è un sacco di codice legacy là fuori che utilizza le cose da C89 che non sono autorizzati a C99 (si può vedere di più la questione " C99 compatibilità ";. che anche link al documento logica C99 che descrive le differenze)

Per quanto riguarda la "questione bonus," non è possibile dichiarare una variabile in un per-dichiarazione in C89; si può in C99. Nel C89, la prima parte di una per-istruzione è un'espressione.

Non ho una spiegazione approfondita per gli standard C.

Ma la mia posizione di default è stata quella di utilizzare C99 quando data la possibilità. Il fatto che fosse l'ultimo standard sviluppato è uno dei motivi (ho un malinteso senso che "più recente è meglio").

Il motivo principale è quindi posso dichiarare le variabili in cicli for.

C99 valida:

for (int i = 0; i < 100; i++)
{
   doSomething();
}

C89, ANSI e più anziani:

int i;
for (i = 0; i < 100; i++)
{
   doSomething();
}
scroll top