Нет, исходный код не обязательно должен быть из файла (или переходить в файл).
Вы можете скомпилировать (и связать) C ++ полностью внутри канала, поместив свой компилятор посередине, например
generate_source | g++ -o- -xc++ - | do_something_with_the_binary
и так было десятилетиями. Смотрите также:
Введение std::source_location
в C ++ 20 не меняет этого положения вещей. Просто у некоторого кода не будет четко определенного местоположения источника (или оно может быть четко определено, но не очень значимо). На самом деле, я бы сказал , что настаивание на определении с std::source_location
помощью файлов немного близорук ... хотя справедливости ради, это просто макро-менее эквивалент __FILE__
и __LINE__
которые уже существуют в C ++ (и C).
@ HBv6 отмечает, что если вы напечатаете значение __FILE__
при компиляции с использованием GCC из стандартного входного потока:
echo -e '#include <iostream>\n int main(){std::cout << __FILE__ ;}' | g++ -xc++ -
запуск полученного исполняемого файла печатает <stdin>
.
Исходный код может быть получен даже из Интернета.
@Morwenn отмечает, что этот код:
#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);
}
работает на GodBolt (но не будет работать на вашем компьютере - ни один популярный компилятор не поддерживает это.)
Вы языковой юрист? Хорошо, давайте посмотрим на стандарт ..
Вопрос о том, должны ли исходные коды программ C ++ происходить из файлов, не имеет четкого ответа в языковом стандарте. Глядя на черновик стандарта C ++ 17 (n4713), раздел 5.1 [lex.separate] гласит:
- Текст программы хранится в единицах, называемых в этом документе исходными файлами. Исходный файл вместе со всеми заголовками (20.5.1.2) и исходными файлами, включенными (19.2) с помощью директивы предварительной обработки #include, за вычетом любых строк исходного кода, пропущенных любой из директив предварительной обработки условного включения (19.1), называется единицей преобразования.
Итак, исходный код не обязательно хранится в файле как таковом, а в «модуле, называемом исходным файлом». Но тогда откуда берутся включения? Можно было бы предположить, что они поступают из именованных файлов в файловой системе ... но это тоже не является обязательным.
В любом случае, std::source_location
похоже , это не меняет эту формулировку в C ++ 20 или не влияет на ее интерпретацию (AFAICT).
__FILE__
. Классsource_location
просто позволяет вам получить его на сайте вызова функции.