2010-04-30 15 views
9

In qualche libreria che sto utilizzando (scritto in C) la suaQuesto è un codice C valido ma non un codice C++ valido?

StorePGM(image, width, height, filename) 
char *image; 
int width, height; 
char *filename; 
{ 
    // something something 
} 

Tutte le funzioni sono definite in questo modo. Non ho mai visto definizioni di funzioni del genere nella mia vita. Sembrano validi per MSVC ma quando li compilo come C++ dà degli errori.

Che cos'è? una specie di vecchia versione C?

+1

Non dovresti compilare arbitrariamente il codice C come C++. Se hai bisogno di usarlo con il codice C++, puoi collegare il codice insieme e dire al tuo codice C++ di usare C-linkage ('extern" C "'). – jamesdlin

+0

Ricordo di aver visto questa sintassi per la prima volta, verso il 1982. Pensavo fossero le ginocchia dell'ape! (Dopo FORTRAN, un sacco di cose sembrano le ginocchia delle api.) – TonyK

risposta

16

Sì. K & R, pre-standard C. Evitare l'uso.

+2

Sì, e suggeriscono anche di non utilizzarlo in un nuovo progetto dalla terza edizione del libro. – tunnuz

+0

@tunnuz, La * terza * edizione? Terza edizione di cosa? –

+1

@Alex - La terza edizione di K & R "The C Programming Language", la bibbia per i programmatori C. – QuantumPete

0

Sì, è K & R-Style. (Kernighan & Ritchie sono gli inventori di C) Vedi anche http://www.lysator.liu.se/c/bwk-tutor.html per esempi di questo stile pre-ANSI.

+6

Kernighan non aveva nulla a che fare con l'invenzione di C. –

+0

Non ne era a conoscenza, grazie. Comunque è stato coautore del primo libro su C ... – MartinStettner

5

Prima dello standard ANSI C del 1989, C non aveva prototipi (dichiarazioni di funzioni che specificano i tipi di parametri); queste dichiarazioni e definizioni vecchio stile erano tutto ciò che era disponibile.

Nel 1989, lo standard ANSI C (che divenne essenzialmente lo standard ISO C 1990) introdusse prototipi. Se ricordo bene, l'idea in realtà proveniva dal C++ (che non era ancora stato standardizzato all'epoca). Le dichiarazioni e le definizioni vecchio stile sono rimaste legali, in modo che il vecchio codice possa ancora essere compilato. Lo standard del 1989 diceva anche che le dichiarazioni vecchio stile erano "obsolescenti", il che significa che potevano essere rimosse in una versione futura dello standard.

Lo standard ISO C del 1999, che (ufficialmente) ha superato lo standard del 1990, ha lasciato questo da solo; le dichiarazioni e le definizioni vecchio stile sono ancora legali e tutti i compilatori conformi devono supportarle (sebbene siano libere di avvertirle, poiché possono mettere in guardia su qualsiasi altra cosa).

A partire dal latest C201X draft (PDF di grandi dimensioni), questo è ancora non modificato. Le dichiarazioni e le definizioni delle funzioni vecchio stile sono ancora una parte necessaria della lingua e tutti i compilatori conformi devono supportarle. (Personalmente, considero questo sfortunato.)

C++, d'altra parte, non ha mai (?) Supportato altro che i prototipi come dichiarazioni di funzioni; Stroustrup non era preoccupato di mantenere la compatibilità con il vecchio codice C.

Tuttavia, a meno che non sia necessario mantenere codice molto vecchio e/o utilizzare compilatori molto vecchi, non vi è alcun motivo valido per utilizzare dichiarazioni o definizioni di funzioni vecchio stile.

Si noti che, almeno in C, questa definizione:

int main() { 
    /* ... */ 
} 

è in realtà una definizione di vecchio stile. E 'corretto per C++, dove è un prototipo che indica che main non ci sono parametri, ma in C dovrebbe essere

int main(void) { 
    /* ... */ 
} 

(C++ accetta anche questa forma per la compatibilità con C - ma per il momento si sta scrivendo main , dovresti già aver deciso quale lingua stai usando.)