2013-07-03 5 views
14

Nur eine kleine Frage: Kann C++ C-Header-Dateien in einem Programm verwenden?Wie C-Code in C++ zu verwenden ist

Das könnte eine seltsame Frage sein, im Grunde muss ich den Quellcode von einem anderen Programm (in C-Sprache) in einem C++ verwenden. Gibt es einen Unterschied zwischen den beiden Header-Dateien im Allgemeinen? Vielleicht, wenn ich einige Bibliotheken ändere ... Ich hoffe, du kannst mir helfen.

+1

Dieser Abschnitt von C++ - FAQ zum Mischen von C und C++ kann hilfreich sein: http://www.parashift.com/c++-faq/mixing-c-and-cpp.html –

+0

Aktualisierter Link für C++ - FAQ: https://isocpp.org/wiki/faq/mixing-c-and-cpp – Phlucious

Antwort

25

Ja, Sie können C-Header in C++ - Code einfügen. Es ist normal, diese hinzuzufügen:

#ifdef __cplusplus 
extern "C" 
{ 
#endif 

// C header here 

#ifdef __cplusplus 
} 
#endif 

, so dass die C++ Compiler weiß, dass Funktionsdeklarationen usw. sollten als C und nicht C++ behandelt werden.

+0

Woah, das wusste ich nicht. So großartig, danke! – SadSeven

+10

Beachten Sie, dass dies nicht bedeutet "kompilieren Sie diesen Code als C". Es bedeutet nur, dass alle Symbole zwischen den Klammern eine C-Verknüpfung haben (was unter anderem bedeutet, dass sie C++ * name mangling * nicht ausführen). – Medinoc

6

Ja, aber Sie müssen den C++ Compiler sagen, dass die Erklärungen aus dem Header sind C:

extern "C" { 
#include "c-header.h" 
} 

Viele C-Header bereits diese aufgenommen haben, in #if defined __cplusplus gewickelt. Das ist wohl etwas komisch (C++ - Syntax in einem C-Header), aber es wird oft aus Bequemlichkeit gemacht.

11

Wenn Sie den C-Code zusammen mit Ihrem C++ - Code als Teil Ihres Projekts kompilieren, sollten Sie nur die Headerdateien wie üblich einfügen und den C++ - Compilermodus verwenden, um den Code zu kompilieren. einige C-Code wird nicht "sauber" mit einem C++ - Compiler kompilieren (zb Verwendung von malloc muss Casting).

Wenn auf der anderen Seite Sie eine Bibliothek oder einen anderen Code haben, der nicht Teil Ihres Projekts ist, müssen Sie sicherstellen, dass die Header als extern "C" markiert sind, andernfalls C++ - Namenskonvention für die kompilierten Namen Es werden Funktionen angewendet, die nicht mit der vom C-Compiler verwendeten Namenskonvention übereinstimmen.

Es gibt zwei Möglichkeiten, entweder Sie die Header-Datei selbst bearbeiten, das Hinzufügen

#ifdef __cplusplus 
extern "C" { 
#endif 

... original content of headerfile goes here. 

#ifdef __cplusplus 
} 
#endif 

Oder, wenn Sie nicht die Möglichkeit, diese Header zu bearbeiten haben, können Sie dieses Formular benutzen:

#ifdef __cplusplus 
extern "C" { 
#endif 
#include <c_header.h>" 
#ifdef __cplusplus 
} 
#endif 
Verwandte Themen