Ich habe eine Header-Datei, die ich aus einer anderen Quelldatei mit include
pre-processor-Verzeichnis einfügen möchte. Ich habe versucht, sowohl zitierte Form als auch Winkel-Brake-Form zu verwenden, aber keiner scheint den Job zu tun.
Der Dateiname ist .>"hello.h
und ein Verzeichnis, in dem der Compiler sucht. Ich habe versucht, es so einzuschließen:
#include <.>"hello.h>
#include <.\>"hello.h>
#include <.\>\"hello.h>
#include ".>"hello.h"
#include ".>\"hello.h"
Ich habe auch verschiedene C und C ++ Compiler ausprobiert - clang, gcc, clang ++ und g ++.
Offensichtlich funktionierte nichts von dem oben Gesagten oder anderweitig, es wäre keine Frage gewesen.
Ich dachte, dass der Name vielleicht nicht dem Standard entspricht. Leider habe ich weder C noch C ++ Standard-Spezifikationen zur Hand. Die einzige maßgebliche Informationsquelle, die ich finden konnte, war diese MSDN -Seite über #include
directory und GNU C Präprozessordokumentation, hier . Die GNU-Dokumentation sagt nicht viel, MSDN hat jedoch die folgende Klausel:
Die Pfadangabe ist ein Dateiname, dem optional ein Verzeichnis vorangestellt ist Spezifikation. Der Dateiname muss eine vorhandene Datei benennen. Die Syntax von Die Pfadangabe hängt vom Betriebssystem ab, auf dem sich das Programm befindet kompiliert.
Ich bin neugierig, was C und C ++ - Standards dazu sagen?
Wo finde ich diese betriebssystemspezifischen Regeln für die Benennung von C und C ++ - Headerdateien? Ich bin besonders an OS X, Linux und FreeBSD interessiert.
Warum funktioniert es nicht, <
und / oder "
Zeichen zu umgehen?
Wie schließe ich meine Datei an?
Ich denke, Sie haben Pech mit diesem Dateinamen von der draft C99 standard
Abschnitt 6.4.7 Header names
Die Grammatik ist wie folgt:
Sie haben sowohl einen "
als auch >
im Dateinamen, was Sie von der q-char
und h-char
Spezifikation ausschließt. Ich glaube nicht, dass Sie eine andere Wahl haben, als den Dateinamen zu ändern.
Die Grammatik ist die gleiche in der draft C++ standard
, Abschnitt 2.9 Header names
.
In C und C ++ ist das kein gültiger Header-Name, da er sowohl >
als auch "
enthält.
Die Syntax für Header-Namen erlaubt, dass die durch <>
begrenzten Elemente "jedes Element des Quellzeichensatzes außer new-line und >
" enthalten und die durch ""
begrenzten Zeichen "jedes Element der Quelle enthalten" Zeichensatz außer new-line und "
". Es gibt kein Konzept für eine Escape-Sequenz.
"und & gt; sind keine gültigen Zeichen für einen Dateinamen in Windows. Ihr Dateiname sollte hello.h oder. \ hello.h oder .. \ hello.h sein, aber nicht. & gt;" hello.h.
%Vor%Aus diesem Grund werden Sie in MSDN nichts darüber finden.
ext3 erlaubt die meisten Zeichen (mehrere müssen bei Verwendung maskiert werden), aber es wird dringend empfohlen, dass Sie sie nicht verwenden, wenn Sie Ihre Header- und Quelldateien benennen (nur aus Gründen der Lesbarkeit). Für weitere Informationen: Ссылка
Was ein akzeptabler Dateiname ist, ist die Implementierung definiert.
Ich hätte erwartet, dass #include ".>\"hello.h" to work, at least
on systems where
'& gt;' and
'"' 'in Dateinamen legal sind, aber
Es gibt keine Anforderung, dass es funktioniert, und es gibt eindeutig
Systeme, in denen es nicht, weil solche Namen in der nicht legal sind
System.
Sie könnten versuchen, das Problem zu erzwingen:
%Vor%Aber aus praktischen Gründen sollten Sie Ihre Dateinamen auf beschränken alphanumerische Zeichen, Unterstriche und vielleicht Bindestriche (aber ich wäre es leary von denen auch). Und mit nur einem Punkt, vor dem Erweiterung. Wenn Sie nach Ärger suchen, seien Sie nicht überrascht, wenn Du findest es.
Was natürlich Ihre letzte Frage beantwortet: Wie schließe ich ein? die Datei. Sie benennen es in etwas Sinnvolles um.
Tags und Links c c++ include c-preprocessor