2010-04-30 18 views
9

W niektórych biblioteki używam (napisany w C) jegoTo jest poprawny kod C, ale nie prawidłowy kod C++?

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

Wszystkie funkcje są zdefiniowane w ten sposób. Nigdy w życiu nie widziałem takich definicji funkcji. Wydaje się, że są one poprawne dla MSVC, ale kiedy kompiluję je jako C++, daje to błędy.

Co to jest? jakąś starą wersję C?

+1

Nie powinieneś arbitralnie kompilować kodu C jako C++. Jeśli musisz użyć go z kodem C++, możesz połączyć ten kod ze sobą i powiedzieć swojemu kodowi C++, aby używał C-łącznika ('extern" C "'). – jamesdlin

+0

Pamiętam, że widziałem tę składnię po raz pierwszy, około 1982 roku. Myślałem, że to kolana pszczół! (Po FORTRAN, wiele rzeczy wygląda jak kolana pszczół.) – TonyK

Odpowiedz

16

Tak. K & R, pre-standard C. Nie używaj go.

+2

Tak, a także sugerują, aby nie używać go w nowym projekcie od trzeciego wydania książki. – tunnuz

+0

@tunnuz, The * third * edition? Trzecie wydanie czego? –

+1

@Alex - Trzecie wydanie K & R "The C Programming Language", biblii dla programistów C. – QuantumPete

5

Przed standardem ANSI C z 1989 roku, C nie posiadało prototypów (deklaracje funkcji określające typy parametrów); te staroświeckie deklaracje i definicje były wszystkim, co było dostępne.

W 1989 r. Standard ANSI C (który stał się standardem ISO C z 1990 r.) Wprowadził prototypy. Jeśli dobrze pamiętam, pomysł faktycznie pochodził z C++ (który nie był jeszcze wtedy ujednolicony). Deklaracje i definicje w starym stylu pozostawały legalne, więc stary kod mógł zostać skompilowany. W standardzie z 1989 roku stwierdzono również, że deklaracje w starym stylu były "przestarzałe", co oznacza, że ​​można je usunąć w przyszłej wersji standardu.

Norma ISO C z 1999 r., Która (oficjalnie) zastąpiła standard z 1990 r., Pozostawiła to w spokoju; deklaracje i definicje w starym stylu są nadal legalne, a wszystkie zgodne kompilatory muszą je wspierać (choć mogą o nich ostrzec, ponieważ mogą ostrzec o wszystkim innym).

Od latest C201X draft (duży plik PDF) ten nadal nie zmienił się. Deklaracje i definicje funkcji w starym stylu są nadal wymaganą częścią języka, a wszystkie zgodne kompilatory muszą je obsługiwać. (Osobiście uważam to za niefortunne.)

C++, z drugiej strony, nigdy (?) Nie wspierało niczego poza prototypami jako deklaracjami funkcji; Stroustrup nie był tak zaniepokojony utrzymaniem kompatybilności ze starym kodem C.

Ale jeśli nie musisz utrzymywać bardzo starego kodu i/lub używać bardzo starych kompilatorów, nie ma powodu, aby używać deklaracji funkcji lub definicji w starym stylu.

Należy zauważyć, że, przynajmniej w C, tej definicji:

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

jest rzeczywiście definicja starym stylu. Jest to poprawne dla C++, gdzie jest to prototyp wskazując, że main nie posiada parametrów, ale w C powinno być

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

(C++ również akceptuje tę formę dla kompatybilności z C - ale do czasu piszesz main , powinieneś już zdecydować, jakiego języka używasz.)