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_location
in 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_location
mithilfe 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:
- 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_location
scheint sich dieser Wortlaut in C ++ 20 nicht zu ändern oder seine Interpretation (AFAICT) zu beeinflussen.
__FILE__
. Mit Classsource_location
können Sie es nur auf der Site für Funktionsaufrufe abrufen.