Erfordert C ++ 20, dass Quellcode in Dateien gespeichert wird?

106

Eine etwas seltsame Frage: Wenn ich mich richtig erinnere, benötigt der C ++ - Quellcode kein Dateisystem, um seine Dateien zu speichern.

Ein Compiler, der handgeschriebene Papiere über eine Kamera scannt, wäre eine konforme Implementierung. Obwohl praktisch nicht so viel Sinn macht.

C ++ 20 fügt jetzt jedoch den Quellspeicherort mit hinzu file_name. Bedeutet dies nun, dass der Quellcode immer in einer Datei gespeichert werden sollte?

JVApen
quelle
13
Dies ist seit Ewigkeiten in C - __FILE__. Mit Class source_locationkönnen Sie es nur auf der Site für Funktionsaufrufe abrufen.
StaceyGirl
28
Können Sie Ihren handschriftlichen Papieren keinen Dateinamen geben?
Jarod42
8
Ich denke, es ist ein Implementierungsdetail, ob sich der Quellcode in Dateien befindet oder etwas anderes. Wenn dem Compiler Quellcode über stdin zugeführt werden kann, befindet sich die Quelle möglicherweise in einer Datenbank.
Eljay
8
Mein Beispiel mag etwas abweichen, aber wenn Sie einen On-the-Fly-Compiler wie TCC verwenden, können Sie für die Fehlerberichterstattung immer einen lesbaren Quellennamen angeben, obwohl Sie direkt aus dem Speicher kompilieren. Das heißt, ein "Dateiname" bedeutet nicht, dass er überhaupt als Datei gespeichert wird.
user7860670
2
Sicherlich sind es die Implementierungsdateien <iostream> , die möglicherweise keine Dateien sind (wenn Sie sehen, was ich meine), nicht die von Entwicklern geschriebenen Dateien?

Antworten:

110

Nein, der Quellcode muss nicht aus einer Datei stammen (oder zu einer Datei gehen).

Sie können C ++ vollständig innerhalb einer Pipe kompilieren (und verknüpfen), indem Sie Ihren Compiler in die Mitte stellen, z

generate_source | g++ -o- -xc++ - | do_something_with_the_binary

und das ist seit Jahrzehnten so. Siehe auch:

Die Einführung std::source_locationin C ++ 20 ändert nichts an diesem Sachverhalt. Es ist nur so, dass einige Codes keinen genau definierten Quellspeicherort haben (oder dass sie genau definiert, aber nicht sehr aussagekräftig sind). Eigentlich würde ich sagen, dass das Bestehen auf der Definition std::source_locationmithilfe von Dateien etwas kurzsichtig ist ... obwohl es fairerweise nur ein makroloses Äquivalent von ist __FILE__und __LINE__das bereits in C ++ (und C) existiert.

@ HBv6 stellt fest, dass, wenn Sie den Wert von __FILE__beim Kompilieren mit GCC aus dem Standardeingabestream drucken :

echo -e '#include <iostream>\n int main(){std::cout << __FILE__ ;}' | g++ -xc++  -

Ausführen der resultierenden ausführbaren Ausdrucke <stdin>.

Der Quellcode kann sogar aus dem Internet stammen.

@ Morwenn stellt fest, dass dieser Code:

#include <https://raw.githubusercontent.com/Morwenn/poplar-heap/master/poplar.h>

// Type your code here, or load an example.
void poplar_sort(int* data, size_t size) {
    poplar::make_heap(data, data + size);
    poplar::sort_heap(data, data + size);
}

funktioniert auf GodBolt ( funktioniert aber nicht auf Ihrem Computer - kein beliebter Compiler unterstützt dies.)

Sind Sie ein Sprachanwalt? Ok, also lasst uns den Standard konsultieren.

Die Frage, ob C ++ - Programmquellen aus Dateien stammen müssen, wird im Sprachstandard nicht eindeutig beantwortet. In Abschnitt 5.1 [lex.separate] wird ein Entwurf des C ++ 17-Standards (n4713) betrachtet:

  1. Der Text des Programms wird in diesem Dokument in Einheiten gespeichert, die als Quelldateien bezeichnet werden. Eine Quelldatei wird zusammen mit allen Headern (20.5.1.2) und Quelldateien (19.2), die über die Vorverarbeitungsanweisung #include enthalten sind (19.2), abzüglich aller Quellzeilen, die von einer der Vorverarbeitungsanweisungen mit bedingtem Einschluss (19.1) übersprungen wurden, als Übersetzungseinheit bezeichnet.

Der Quellcode wird also nicht unbedingt in einer Datei an sich gespeichert, sondern in einer "Einheit, die als Quelldatei bezeichnet wird". Aber woher kommen dann die Includes? Man würde annehmen, dass sie aus benannten Dateien im Dateisystem stammen ... aber auch das ist nicht vorgeschrieben.

Jedenfalls std::source_locationscheint sich dieser Wortlaut in C ++ 20 nicht zu ändern oder seine Interpretation (AFAICT) zu beeinflussen.

einpoklum
quelle
9
Diese Pipe ist eine "Quelldatei" im Sinne des Standards.
Melpomene
5
Ich betrachte den C-Standard, der definiert: "Der Text des Programms wird in Einheiten, die als Quelldateien (oder Vorverarbeitungsdateien ) bezeichnet werden, in diesem internationalen Standard gespeichert ." Wo immer der Code gespeichert ist, ist dies eine "Quelldatei" in Standardese. (Nachtrag: Eine ähnliche Sprache findet sich im C ++ - Standard unter [lex].)
Melpomene
8
@melpomene: Die Geräte werden nur genannt Quelldateien, es nicht sagen , dass sie tatsächlich Quelldateien sein. Aber ich werde die Antwort bearbeiten, um dies einzuschließen.
Einpoklum
13
Ich habe es gerade mit GCC versucht: "echo '#include <stdio.h> \ nint main () {printf ("% s \\ n ", __FILE__); return 1;}' | gcc -o test -xc -" ( ohne Anführungszeichen). Bei der Ausführung wird <stdin> ausgedruckt.
HBv6
11
Hier ist eine lustige Sache über Begriffe und Namen und Konzepte in Standards (und Wissenschaften): Sie sind normalerweise atomar. Das heißt, "Quelldatei" ist nicht unbedingt eine "Datei", die "Quelle" ist. Tatsächlich kann der Begriff "Datei" einfach nicht definiert werden - vergleichen Sie mit Zahlen in der Mathematik: Es gibt nicht nur eine "Datei". Zahl ", nur" natürliche Zahl "," rationale Zahl "," reelle Zahl "usw.
Joker_vD
53

Schon vor C ++ 20 hatte der Standard:

__FILE__

Der vermutete Name der aktuellen Quelldatei (ein Zeichenfolgenliteral).

Die Definition ist die gleiche für source_location::file_name.

Daher hat sich an der Unterstützung für implementierungen ohne Dateisystem in C ++ 20 nichts geändert.

Der Standard definiert nicht genau, was "Quelldatei" bedeutet. Ob es sich also um ein Dateisystem handelt, kann interpretiert werden. Vermutlich könnte es für eine Implementierung konform sein, "die handschriftliche Notiz zu erstellen, die Sie mir gerade gegeben haben", wenn dies tatsächlich die "Quelldatei" in dieser Implementierung der Sprache identifiziert.


Fazit: Ja, Quellen werden vom Standard als "Dateien" bezeichnet, aber was eine "Datei" ist und ob ein Dateisystem beteiligt ist, ist nicht spezifiziert.

Eerorika
quelle
2
@Yksisarvinen Ich kenne die Absicht der "Vermutungs" -Qualifizierung der Regel nicht genau, aber ich gehe davon aus :), dass es eine Klarstellung ist, dass der Dateiname absolut oder kanonisch sein muss, sondern aus Sicht von ein relativer Name Der Compiler ist ausreichend. Ich könnte falsch liegen.
Eerorika
4
Ich kann nur sehen scanner-c++, wie "Linker Schrank, dritte Schublade, vierter Ordner mit roten Registerkarten, Seite 17" zurückgegeben wird .
dmckee --- Ex-Moderator Kätzchen
2
FWIW, im POSIX-Sinne, ist eine Pipe (oder eine andere dateiähnliche Sache) eine "Datei" - als solche sind stdin / stdout "Dateien", nur keine Festplattendateien usw. in diesem Sinne.
3
@Yksisarvinen: Der Ausschuss berücksichtigt häufig Situationen, in denen obskure Implementierungen gute Gründe haben könnten, etwas zu tun, das dem alltäglichen Verhalten widerspricht. Dabei müssen Compiler-Autoren beurteilen, ob ihre Kunden das alltägliche Verhalten mehr oder weniger nützlich finden als eine Alternative. Die Tatsache, dass solche Dinge dem Urteil der Implementierer überlassen bleiben, kann als "Mehrdeutigkeit" angesehen werden, ist jedoch absichtlich, da gute Compiler-Autoren mehr über die Bedürfnisse ihrer Kunden wissen, als das Komitee jemals könnte.
Supercat
1
@dmckee ... in einer stillgelegten Toilette mit einem Schild an der Tür mit der Aufschrift "Vorsicht vor dem Leoparden".
Andrew Henle