2010-04-30 3 views
9

Dans une bibliothèque que je utilise (écrit en C) sonCeci est un code C valide mais pas un code C++ valide?

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

Toutes les fonctions sont définies de cette façon. Je n'ai jamais vu de telles définitions de fonctions dans ma vie. Ils semblent être valides pour MSVC mais quand je le compile en C++ il donne des erreurs.

Qu'est-ce que c'est? une sorte de vieille version C?

+1

Vous ne devriez pas compiler arbitrairement le code C en C++. Si vous avez besoin de l'utiliser avec du code C++, vous pouvez lier le code et dire à votre code C++ d'utiliser C-linkage ('extern" C "'). – jamesdlin

+0

Je me souviens avoir vu cette syntaxe pour la première fois, vers 1982. Je pensais que c'était les genoux de l'abeille! (Après FORTRAN, beaucoup de choses ressemblent aux genoux de l'abeille. – TonyK

Répondre

16

Oui. K & R, pré-standard C. Évitez de l'utiliser.

+2

Oui, et ils suggèrent également de ne pas l'utiliser dans un nouveau projet depuis la troisième édition du livre. – tunnuz

+0

@tunnuz, La * troisième * édition? Troisième édition de quoi? –

+1

@Alex - La troisième édition de "The C Programming Language" de K & R, la bible pour les programmeurs C. – QuantumPete

0

Oui, c'est K & R-Style. (Kernighan & Ritchie sont les inventeurs de C) Voir aussi http://www.lysator.liu.se/c/bwk-tutor.html pour des exemples de ce style pré-ANSI.

+6

Kernighan n'avait rien à voir avec l'invention de C. –

+0

N'a pas été au courant de ce fait, merci. Quoi qu'il en soit, il a co-écrit le premier livre sur C ... – MartinStettner

5

Avant la norme ANSI C 1989, C n'avait pas de prototypes (déclarations de fonction qui spécifient les types de paramètres); ces déclarations et définitions à l'ancienne étaient tout ce qui était disponible.

En 1989, la norme ANSI C (qui est devenue essentiellement la norme ISO C 1990) a introduit des prototypes. Si je me souviens bien, l'idée venait en fait du C++ (qui n'avait pas encore été standardisé à l'époque). Les déclarations et les définitions à l'ancienne restaient légales, de sorte que l'ancien code pouvait encore être compilé. La norme de 1989 a également déclaré que les déclarations de style ancien étaient «obsolètes», ce qui signifie qu'elles pourraient être supprimées dans une future version de la norme.

La norme ISO C de 1999, qui a remplacé (officiellement) la norme de 1990, l'a laissée tranquille; les déclarations et les définitions de style ancien sont toujours légales, et tous les compilateurs conformes doivent les prendre en charge (bien qu'ils soient libres de les avertir, car ils peuvent avertir de toute autre chose).

A partir du latest C201X draft (grand format PDF), ce n'a pas changé. Les déclarations et les définitions de fonctions de style ancien sont toujours une partie obligatoire du langage et tous les compilateurs conformes doivent les prendre en charge. (Personnellement, je considère cela comme regrettable.)

Par contre, C++ n'a jamais (?) Supporté autre chose que des prototypes comme des déclarations de fonction; Stroustrup n'était pas aussi préoccupé par le maintien de la compatibilité avec l'ancien code C. Mais à moins que vous ayez besoin de maintenir un très ancien code et/ou d'utiliser des compilateurs très anciens, il n'y a aucune raison d'utiliser des déclarations de fonctions ou des définitions de style ancien.

Notez que, au moins en C, cette définition:

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

est en fait une définition ancienne. Il est correct pour C++, où il est un prototype qui indique que main n'a pas de paramètres, mais en C, il devrait être

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

(C++ accepte également cette forme pour la compatibilité avec C - mais au moment où vous écrivez main , vous devriez déjà avoir décidé quelle langue vous utilisez.)