2010-05-10 7 views
10

Mögliche Duplizieren:
What is the difference between using #include<filename> and #include<filename.h> in c++C++ enthält mit und ohne .h

Ich habe noch nie bemerkt es einen Unterschied macht, ob ich die .h am Ende einer Include Include, so habe ich immer die Bedeutung ignoriert, aber ich habe gerade in einem bestimmten Programm von mir bemerkt, bekomme ich den Fehler "memcpy wurde in diesem Bereich nicht deklariert", wenn ich "String", aber nicht wenn ich "" string.h ".

Zuallererst fragte ich mich nach der genauen Ursache, aber auch allgemein nach dem Unterschied zwischen den beiden. Zur gleichen Zeit, wenn jemand den Unterschied zwischen Einschlüssen in eckigen Klammern und solchen in Anführungszeichen erklären könnte, würde es sehr geschätzt werden.

+1

http: // Stapelüberlauf.com/questions/301586/what-is-the-difference-zwischen-using-includedateiname-und-includedateiname-h –

Antwort

22

<string> ist die C++ - Standardbibliothek Zeichenfolge Header-Datei enthält std::string und seine Freunde. <string.h> ist eine andere Kopfzeile aus der C-Standardbibliothek, die Funktionen zum Manipulieren von C-Zeichenfolgen (nullterminierte Zeichenfolgen) und anderen verwandten Funktionen aufweist.

Die beiden sind völlig unterschiedlich und nicht miteinander verwandt. In C++ (wie in C) kann eine Header-Datei eine beliebige Erweiterung haben. Die Header der C++ - Standardbibliothek haben keine Erweiterung; Die Header der C-Standardbibliothek haben eine Erweiterung .h. .hpp oder .hxx sind ebenfalls üblich.

+2

Und beachten Sie auch, dass (obwohl ich glaube) die Include-Direktive '' oder was auch immer ist, der Compiler isn ' t erforderlich, um die entsprechende Datei 'string' tatsächlich aufzurufen. –

+0

@Mark B: In der Tat; es muss nicht einmal eine Datei sein. Ich kenne keine Implementierungen, die keine Dateien mit den Namen der Header verwenden. Ich denke, ich würde das ziemlich verwirrend finden! –

+3

Alles, was James sagte, ist wahr. Interessant ist auch, dass die C-String-Datei im aktualisierten Standard C++ in umbenannt wurde - tatsächlich wurden alle C-Standardbibliotheken, wenn sie in die C++ - Standardbibliothek befördert wurden, mit einem Präfix 'c' und keinem '.h umbenannt 'extension, dh, cstdlib, cstdio, etc. Es wird angenommen, dass die C-Funktionen auch in den std-Namensraum verschoben werden. Viele Compiler unterstützen weiterhin , et al., Und nicht, um die C-Standardbibliothek in std :: zu setzen, aber ich glaube, dass sie nicht mehr benötigt werden. – jwismar

2

Sie sind 2 verschiedene Dateien und haben nichts miteinander zu tun.

#include <string> bezieht sich auf die Standard-Bibliothek STL strings ++ C

#include <string.h> mehrere Funktionen definiert C Strings und Arrays zu manipulieren.

Es wird keine Erweiterung für Includes angenommen.

Einige Header-Dateien haben keine angehängte .h. Sie sehen dies häufig bei Header-Dateien, die Vorlagen enthalten.

0

Was den Unterschied zwischen der Verwendung von eckigen Klammern und Anführungszeichen betrifft, denke ich, dass es etwas mit der Reihenfolge zu tun hat, in der die Header-Dateien gesucht werden: Wenn es zwischen Anführungszeichen steht, prüft der Compiler zuerst das Arbeitsverzeichnis (nicht sehr nützlich im Fall von Systemheadern, da sie nicht im selben Verzeichnis wie der Compiler sind), bevor das Systemheaderverzeichnis überprüft wird.

4

Ich werde nur hinzufügen, dass in C++ gibt es C-Header in einem traditionellen C-Form wie string.h und diejenigen wie #include <string.h> verwendet werden, aber es gibt auch ihre Gegenstücke mit den Namen beginnend mit dem Buchstaben "C" und ohne eine Erweiterung - wie cstring. Diese Header werden wie die C++ - Header #include <cstring> verwendet, und die Namen dieser Header befinden sich im Namespace std.

0

Über den Unterschied zwischen Includes in eckigen Klammern und denen in Anführungszeichen weist die erste den Präprozessor an, zuerst nach Include-Dateien zu suchen, und zwar entlang des Pfads, der von der Compileroption/I angegeben wird. Die zweite Anweisung weist den Präprozessor an, nach Include-Dateien im selben Verzeichnis der Datei zu suchen, die die # include-Anweisung enthält.

Verwandte Themen