Ответ 1
Нет, исходный код не обязательно должен быть из файла.
Вы можете скомпилировать (и связать) C++ полностью внутри канала, поместив ваш компилятор посередине, например,
generate_source | g++ -o- -xc++ - | do_something_with_the_binary
и так было десятилетиями. Смотрите также:
Введение std::source_location
в C++ 20 не меняет этого положения дел. Просто у некоторого кода не будет четко определенного исходного местоположения (или он может быть четко определенным, но не очень значимым). На самом деле, я бы сказал, что настойчивость в определении std::source_location
с использованием файлов немного близорука... хотя, честно говоря, это всего лишь безреальный эквивалент __FILE__
и __LINE__
, которые уже существуют в 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).