2010-12-18 3 views
1

Ich verstehe das Konzept dahinter, obwohl ich nicht genau verstehe, warum es benötigt wird.Der Zweck der Verpackung Header mit #ifdef _cplusplus

Wenn der Zweck ist zu verhindern „Mangeln“ von Headern, wenn der Code in C nicht kompiliert wird ++:

-Wie ist der Code, wenn nicht in C++ kompiliert?

-wie würde der Code ohne diesen Header weiter funktionieren?

Und tangential:

-was Umständen würde dies erfordern?

Antwort

4
  • Wie wird der Code kompiliert, wenn nicht in C++?

Mit C.

  • wie würde der Code weiterhin ohne diesen Header funktionieren?

Deshalb ist die Kopfzeile enthalten. Wenn es kompilieren und ohne den Header mit einem C++ - Compiler arbeiten würde, wäre die #ifdef ziemlich sinnlos.

  • Welche Umstände würden dies erfordern?

Sie können nur Sachen einbringen, die beim Kompilieren mit einem C++ - Compiler benötigt werden. Vielleicht muss ein Debug-Makro std::cerr verwenden, dann kann dieser Header <iostream> enthalten. Es könnte Millionen von Gründen haben.

1

Wenn C++ nicht definiert ist, wäre es auf nicht C++ spezifischen Header verlassen (möglicherweise in C geschrieben)

Welche Umstände erfordern würde dies eine gute Frage.

+0

Das scheint jetzt offensichtlich, dass Sie es gesagt haben. – Bacu

2

Der üblicher Grund dafür ist es Funktionen C oder C++ Verknüpfung zu geben:

#ifdef _cplusplus 
extern "C" { 
#endif 
#include headerfile.h 
#ifdef _cplusplus 
} 
#endif 
0

ich diesen Thread weiß wahrscheinlich tot ist, aber es ist immer noch sehr viel in der Suchmaschinen am Leben, damit ich dachte, ich würde einige schreiben Mehr Details. C++ ändert Routine-Namen (fügt eine Reihe von Zeichen hinzu), wenn sie kompiliert werden. Ich habe nicht das Wissen, dir zu sagen, warum es das tut. Ich würde vermuten, dass Routinen eindeutig unter allen Namespaces und Klassen im Programm identifiziert werden. Egal, C macht keine Namen. Wenn Sie versuchen, eine C-Header-Datei in Ihr Projekt aufzunehmen, wird alles gut während der Kompilierung funktionieren, aber wenn Sie C++ verknüpfen, werden die Namen der Routinen in der C-Header-Datei fehlerhaft und versuchen, sie in der Objektdatei für die C-Routinen zu finden. Es wird nicht in der Lage sein, sie zu finden, weil es erwartet, dass sie entstellt werden.

Dies ist am häufigsten, wenn Sie versuchen, eine bereits vorhandene C-Bibliothek zu verwenden. In diesem Fall können Sie den C-Code nicht als C++ neu kompilieren, um die Namensänderung wiederherzustellen. Sie müssen also dem C++ - Compiler mitteilen, dass er C-artige Routinen mit 'extern' C '' sucht. Das Einfügen in die Header-Datei ist nicht notwendig, aber wo immer ein C++ - Compiler eine Deklaration einer C-Routine findet, wird es sie brauchen. Die Platzierung der Header-Datei soll verhindern, dass Sie sich wiederholen.

Dies kann auch in einigen IDEs auftreten. Im Grunde führt dies jedoch dazu, dass eine C-Bibliothek mit einem C++ - Programm/einer C++ - Bibliothek verknüpft wird. Wenn gcc verwendet wurde, um es zu kompilieren, wird g ++ Probleme haben, es herauszufinden.