Domanda

Perché è ancora C99 misto dichiarazioni e codice non utilizzato in open source progetti in C, come il Linux kernel o GNOME?

Mi piace molto misto e le dichiarazioni di codice, in quanto rende il codice più leggibile e impedisce difficile vedere i bug da limitare la portata delle variabili per il più stretto possibile.Questo è raccomandato da Google per il C++.

Per esempio, Linux richiede almeno GCC 3.2 e GCC 3.1 ha il supporto per C99 misto dichiarazioni e codice

È stato utile?

Soluzione

Questa è una vecchia questione, ma ho intenzione di suggerire che l'inerzia è la ragione che la maggior parte di questi progetti utilizzano ancora ANSI C regole dichiarazioni.

Per quanto ci sono un certo numero di altre possibilità, che vanno dal ridicolo valido:

  • Portabilità. Molti progetti open source lavorano sotto l'ipotesi che saccente ANSI C è il modo più portatile al software di scrittura.

  • Age. Molti di questi progetti risalgono a prima C99 specifiche e gli autori possono preferire uno stile di codifica coerente.

  • L'ignoranza. I programmatori hanno presentato anteriori C99 e non sono consapevoli dei vantaggi di dichiarazioni e codice misto. (Interpretazione alternativo: Gli sviluppatori sono pienamente consapevoli dei potenziali compromessi e decidono che le dichiarazioni contrastanti e dichiarazioni non sono vale la pena vivamente d'accordo, ma è raro che due programmatori saranno d'accordo su nulla..)

  • FUD. I programmatori vedono dichiarazioni e codice misti come un "ismo ++ C" e non amano per questo motivo.

Altri suggerimenti

non bisogno di dichiarazione mista e il codice per la portata limite. Si può fare:

{
  int c;
  c = 1;
  {
    int d = c + 1;
  }
}

a C89. Per quanto riguarda le dichiarazioni contrastanti perché questi progetti non hanno usato (sempre che sia vero), è più probabile un caso di "Se non è rotto non aggiustarlo".

Non v'è motivo di riscrivere il kernel di Linux permette di apportare cambiamenti che non offrono miglioramenti delle prestazioni.

Se il codice di base funziona, quindi perché cambiare per ragioni estetiche?

Io non ricordo nessun divieti contro questo nella guida di stile per il codice del kernel.Tuttavia, non dire che le funzioni devono essere il più piccolo possibile, e fare solo una cosa.Questo spiegherebbe perché una miscela di dichiarazioni e di codice è raro.

In una piccola funzione, dichiarare le variabili all'inizio del campo di applicazione agisce come una sorta di Introito, dicendo qualcosa su quello che accadrà subito dopo.In questo caso il movimento della dichiarazione di variabile è così limitato che sarebbe probabilmente o non hanno alcun effetto, o servono a nascondere alcune informazioni circa la funzionalità premendo il barker in mezzo alla folla, per così dire.C'è una ragione che l'arrivo di un re è stato dichiarato prima egli entrò in una stanza.

OTOH, una funzione che deve mix di variabili e il codice leggibile è probabilmente troppo grande.Questo è uno dei segni (insieme con troppo-i blocchi nidificati, commenti in linea e altre cose) che alcune sezioni di una funzione devono essere sottratto in funzioni separate (e dichiarato static, l'ottimizzatore può inline di loro).

Un altro motivo per mantenere dichiarazioni all'inizio di funzioni:se avete bisogno di riordinare l'esecuzione di istruzioni in codice, è possibile spostare una variabile al di fuori del suo campo di applicazione, senza rendersene conto, dal momento che l'ambito di applicazione di una variabile dichiarata nel mezzo di codice non è evidente il rientro (a meno che non si utilizza un blocco per mostrare il campo di applicazione).Questo è facilmente risolto, quindi è solo un fastidio, ma il nuovo codice spesso subisce questo tipo di trasformazione, e il disturbo può essere cumulativo.

E un altro motivo:si potrebbe essere tentati di dichiarare una variabile per prendere l'errore di codice restituito da una funzione, in questo modo:

void_func();
int ret = func_may_fail();
if (ret) { handle_fail(ret) }

Perfettamente cosa ragionevole da fare.Ma:

void_func();
int ret = func_may_fail();
if (ret) { handle_fail(ret) }
....
int ret = another_func_may_fail();
if (ret) { handle_other_fail(ret); }

Ooops! ret è definito due volte."Quindi?Rimuovere la seconda dichiarazione." si dice.Ma questo rende il codice asimmetrica, e si finisce con più di refactoring limitazioni.

Naturalmente, I mix e le dichiarazioni di codice di me stesso;nessun motivo per essere dogmatici su di esso (o altro karma può far funzionare la vostra dogma :-).Ma si dovrebbe sapere che cosa le concomitanti problemi.

Forse non è necessario, forse la separazione è buono? Lo faccio in C ++, che ha questa caratteristica pure.

Non v'è alcun motivo per modificare il codice via come questa, e C99 non è ancora ampiamente supportato dai compilatori. Si tratta per lo più di portabilità.

Non v'è alcun beneficio. Dichiarare tutte le variabili all'inizio della funzione (pascal simili) è molto più chiaro, nel C89 è anche possibile dichiarare le variabili all'inizio di ogni campo di applicazione (all'interno loop esempio) che è sia pratico e conciso.

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