Требует ли C++20 хранения исходного кода в файлах?
Немного странный вопрос, однако, если я правильно помню, исходный код C++ не требует файловой системы для хранения своих файлов.
Наличие компилятора, который сканирует рукописные документы через камеру, будет соответствующей реализацией. Хотя практически не имеет особого смысла.
Однако C++20 теперь добавляет местоположение источника с file_name
, Означает ли это, что исходный код всегда должен храниться в файле?
2 ответа
Нет, исходный код не обязательно должен быть из файла.
Вы можете скомпилировать (и связать) C++ полностью внутри канала, поместив ваш компилятор посередине, например
generate_source | g++ -o- -xc++ - | do_something_with_the_binary
и так было десятилетиями. Смотрите также:
Вступление к std::source_location
в C++20 это не меняет положения вещей. Просто у некоторого кода не будет четко определенного исходного местоположения (или он может быть четко определенным, но не очень значимым). На самом деле, я бы сказал, что требование определения 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++17 (n4713), раздел 5.1 [lex.separate] гласит:
- Текст программы хранится в единицах, называемых исходными файлами в этом документе. Исходный файл вместе со всеми заголовками (20.5.1.2) и исходными файлами, включенными (19.2) через директиву предварительной обработки #include, за исключением любых строк исходного текста, пропущенных любой из директив предварительной обработки условного включения (19.1), называется единицей перевода.
Таким образом, исходный код не обязательно хранится в файле как таковом, но в "модуле, называемом исходным файлом". Но тогда откуда берутся включения? Можно предположить, что они происходят из именованных файлов в файловой системе... но это тоже не обязательно.
Во всяком случае, std::source_location
не похоже, чтобы изменить эту формулировку в C++20 или повлиять на ее интерпретацию (AFAICT).
Еще до C++20 стандарт имел:
__FILE__
Предполагаемое имя текущего исходного файла (символьная строка-литерал).
Определение то же самое для source_location::file_name
,
Таким образом, не было изменений в отношении поддержки реализаций без файловой системы в C++20.
Стандарт точно не определяет, что означает "исходный файл", поэтому вопрос о том, относится ли он к файловой системе, может зависеть от интерпретации. Предположительно, реализация могла бы создать "рукописную заметку, которую вы мне дали именно тогда", если это действительно идентифицирует "исходный файл" в этой реализации языка.
В заключение: да, источники называются стандартом "файлы", но что такое "файл" и задействована ли файловая система, не определено.