No, source code doesn't have to come from a file (nor go to a file).
You can compile (and link) C++ completely within a pipe, putting your compiler in the middle, e.g.
generate_source | g++ -o- -xc++ - | do_something_with_the_binary
and it's been like that for decades. See also:
The introduction of std::source_location
in C++20 doesn't change this state of affairs. It's just that some code will not have a well-defined source location (or it may be well-defined, but not very meaningful). Actually, I'd say that the insistence on defining std::source_location
using files is a bit myopic... although in fairness, it's just a macro-less equivalent of __FILE__
and __LINE__
which already exist in C++ (and C).
@HBv6 notes that if you print the value of __FILE__
when compiling using GCC from the standard input stream:
echo -e '#include <iostream>\n int main(){std::cout << __FILE__ ;}' | g++ -xc++ -
running the resulting executable prints <stdin>
.
Source code can even come from the Internet.
@Morwenn notes that this 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);
}
works on GodBolt (but won't work on your machine - no popular compiler supports this.)
Are you a language lawyer? Ok, so let's consult the standard..
The question of whether C++ program sources need to come from files is not answered clearly in the language standard. Looking at a draft of the C++17 standard (n4713), section 5.1 [lex.separate] reads:
- The text of the program is kept in units called source files in this document. A source file together with all the headers (20.5.1.2) and source files included (19.2) via the preprocessing directive #include, less any source lines skipped by any of the conditional inclusion (19.1) preprocessing directives, is called a translation unit.
So, the source code is not necessarily kept in a file per se, but in a "unit called a source file". But then, where do the includes come from? One would assume they come from named files on the filesystem... but that too is not mandated.
At any rate, std::source_location
does not seem to change this wording in C++20 or to affect its interpretation.
__FILE__
. Classsource_location
just allows you to get it at function call site. – Diary<iostream>
that may not be files (if you see what I mean), not the files written by developers? – Procaine"<stdin>"
? ☻ – Purdy"<stdin>"
seems more appropriated for source provided bystdin
."Handwritten paper 01"
might be more appropriate in such case. – Psittacosis