2013-04-24 7 views
6

erwartet ich immer noch kämpfen, eine C-Konsolenanwendung, die Compilierung Verfahren noch mit dem Fehler Fehler zu kompilieren unter:extern „C“ Fehler # 2040: eine Kennung

"Main.c", line 51: error #2040: expected an identifier 
    extern "C" void TreatReceivedSignal(int NoSignal) ; 
     ^
1 error detected in the compilation of "Main.c". 
gmake: *** [Main.o] Error 2 

unter der Deklaration der externen Methode auf dem C-Code:

extern "C" void TreatReceivedSignal(int NoSignal) ; 

ich bin mit HP-UX aCC Compiler [HP C/aC++ B3910B A.06.26], auch wechselte ich auf der Compilation Flag -ae C99-Unterstützung zu aktivieren. Scheint, dass der Compiler das 'extern' C '' nicht als C-reserviertes Wort erkennen kann, muss ein anderes Kompilierungsflag gesetzt werden. Irgendeine Idee, die diese Art von Problem lösen kann? Vielen Dank im Voraus. Grüße

+0

C und C++ sind nicht * ähnlich *. Behandele sie nicht so, wie sie sind. Lerne einen oder lerne den anderen. Lerne sie nicht gleichzeitig. Schreiben Sie keinen C-Code, um "als C++ kompilierbar" zu sein. Es gibt viele Gründe, warum das eine schlechte Idee ist. Schreiben Sie in C oder schreiben Sie in C++. Wenn Sie C-Code mit einem C++ - Projekt verknüpfen möchten, kompilieren Sie den C-Code mit einem C-Compiler und verwenden Sie Ihren C++ - Linker, um den Objektcode zu verknüpfen. – Sebivor

Antwort

12

Das extern "C" Konstrukt ist ein C++ spezifische Sache, kann es nicht in C verwendet werden, und der Compiler behandelt Quelldatei als Datei C-Quelle, da sie die Erweiterung .c hat.

Die häufigste, was zu tun ist, um die Prä-Prozessor zu verwenden, um bedingt fügen Sie diese für C++ Compilations:

#ifdef __cplusplus 
extern "C" { 
#endif 

/* Standard C prototypes */ 

#ifdef __cplusplus 
} 
#endif 
+0

wie ich es kenne C und C++ - Methode kann auf beiden Sprachen mit dem Verknüpfungsmechanismus verwendet werden – jamel

+0

@jamel Sie können die Funktion von C und C++ verwenden, es ist das 'extern" C ", was der Compiler beschweren . Dieses Konstrukt ist nicht in der C-Sprache. –

+0

Ja ich weiß nicht, warum es kompiliert, aber ich kompilierte die gleiche Anwendung mit einer älteren Version von aCC! Diese Version benötigt möglicherweise ein zusätzliches Flag, das während der Kompilierung gesetzt wird! – jamel