Einbeziehung von Quelldateien
Fügt eine andere Quelldatei an der Zeile unmittelbar nach der Direktive in die aktuelle Quelldatei ein.
Inhalt |
[bearbeiten] Syntax
#include < h-char-sequence > new-line |
(1) | ||||||||
#include " q-char-sequence " new-line |
(2) | ||||||||
#include pp-tokens new-line |
(3) | ||||||||
__has_include ( " q-char-sequence " )__has_include ( < h-char-sequence > ) |
(4) | (seit C23) | |||||||
__has_include ( string-literal )__has_include ( < h-pp-tokens > ) |
(5) | (seit C23) | |||||||
| new-line | - | Das Zeilenumbruchzeichen |
| h-char-sequence | - | Eine Sequenz aus einem oder mehreren h-chars, wobei das Auftreten eines der folgenden undefiniertes Verhalten verursacht
|
| h-char | - | Jedes Mitglied des Quellzeichensatzes außer Zeilenumbruch und > |
| q-char-sequence | - | Eine Sequenz aus einem oder mehreren q-chars, wobei das Auftreten eines der folgenden undefiniertes Verhalten verursacht
|
| q-char | - | Jedes Mitglied des Quellzeichensatzes außer Zeilenumbruch und " |
| pp-tokens | - | Eine Sequenz aus einem oder mehreren Präprozessor-Tokens |
| string-literal | - | Ein String-Literal |
| h-pp-tokens | - | Eine Sequenz aus einem oder mehreren Präprozessor-Tokens außer > |
[bearbeiten] Erklärung
include in der Direktive werden wie in normalem Text verarbeitet (d. h., jeder Bezeichner, der derzeit als Makroname definiert ist, wird durch seine Ersetzungsliste von Präprozessor-Tokens ersetzt). Die Direktive, die nach allen Ersetzungen resultiert, muss eine der beiden vorherigen Formen entsprechen. Die Methode, mit der eine Sequenz von Präprozessor-Tokens zwischen einem Präprozessor-Token-Paar < und > oder einem Paar von "-Zeichen zu einem einzigen Header-Namen-Präprozessor-Token kombiniert wird, ist implementierungsdefiniert.__has_include ergibt 1, wenn die Suche nach der Quelldatei erfolgreich ist, und 0, wenn die Suche fehlschlägt.Wenn die Datei nicht gefunden wird, ist das Programm schlecht geformt.
|
|
(seit C23) |
[bearbeiten] Hinweise
Typische Implementierungen durchsuchen für Syntax (1) nur Standard-Include-Verzeichnisse. Die Standard-C-Bibliothek ist implizit in diesen Standard-Include-Verzeichnissen enthalten. Die Standard-Include-Verzeichnisse können normalerweise durch den Benutzer über Compiler-Optionen gesteuert werden.
Die Absicht der Syntax (2) ist es, nach Dateien zu suchen, die nicht von der Implementierung gesteuert werden. Typische Implementierungen durchsuchen zuerst das Verzeichnis, in dem sich die aktuelle Datei befindet, und greifen dann auf (1) zurück.
Wenn eine Datei eingeschlossen wird, wird sie durch die Übersetzungsphasen 1-4 verarbeitet, was, rekursiv, die Erweiterung von verschachtelten #include-Direktiven bis zu einer implementierungsdefinierten Verschachtelungsgrenze umfassen kann. Um die wiederholte Einbeziehung derselben Datei und endlose Rekursionen zu vermeiden, wenn eine Datei sich selbst, vielleicht transitiv, einschließt, werden *Header-Schutzvorrichtungen* häufig verwendet: Der gesamte Header wird in
#ifndef FOO_H_INCLUDED /* any name uniquely mapped to file name */ #define FOO_H_INCLUDED // contents of the file are here #endif
Viele Compiler implementieren auch die nicht standardmäßige pragma #pragma once mit ähnlichen Effekten: Sie deaktiviert die Verarbeitung einer Datei, wenn dieselbe Datei (wobei die Identität der Datei betriebssystemspezifisch bestimmt wird) bereits eingeschlossen wurde.
Ein Ergebnis von 1 von __has_include bedeutet nur, dass eine Header- oder Quelldatei mit dem angegebenen Namen existiert. Es bedeutet nicht, dass die Header- oder Quelldatei, wenn sie eingeschlossen wird, keinen Fehler verursacht oder etwas Nützliches enthält.
[bearbeiten] Beispiel
| Dieser Abschnitt ist unvollständig Grund: kein Beispiel |
[bearbeiten] Referenzen
- C23-Standard (ISO/IEC 9899:2024)
- 6.4.7 Header-Namen (S. 69)
- 6.10.1 Bedingte Einbeziehung (S. 165-169)
- 6.10.2 Einbeziehung von Quelldateien (S. 169-170)
- C17-Standard (ISO/IEC 9899:2018)
- 6.10.2 Einbeziehung von Quelldateien (S. 119-120)
- C11-Standard (ISO/IEC 9899:2011)
- 6.10.2 Einbeziehung von Quelldateien (S. 164-166)
- C99-Standard (ISO/IEC 9899:1999)
- 6.10.2 Einbeziehung von Quelldateien (S. 149-151)
- C89/C90-Standard (ISO/IEC 9899:1990)
- 3.8.2 Einbeziehung von Quelldateien
[bearbeiten] Siehe auch
| Eine Liste von C-Standardbibliotheks-Header-Dateien | |
| C++-Dokumentation für Einbeziehung von Quelldateien
|