Требует ли 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] гласит:

  1. Текст программы хранится в единицах, называемых исходными файлами в этом документе. Исходный файл вместе со всеми заголовками (20.5.1.2) и исходными файлами, включенными (19.2) через директиву предварительной обработки #include, за исключением любых строк исходного текста, пропущенных любой из директив предварительной обработки условного включения (19.1), называется единицей перевода.

Таким образом, исходный код не обязательно хранится в файле как таковом, но в "модуле, называемом исходным файлом". Но тогда откуда берутся включения? Можно предположить, что они происходят из именованных файлов в файловой системе... но это тоже не обязательно.

Во всяком случае, std::source_location не похоже, чтобы изменить эту формулировку в C++20 или повлиять на ее интерпретацию (AFAICT).

Еще до C++20 стандарт имел:

__FILE__

Предполагаемое имя текущего исходного файла (символьная строка-литерал).

Определение то же самое для source_location::file_name,

Таким образом, не было изменений в отношении поддержки реализаций без файловой системы в C++20.

Стандарт точно не определяет, что означает "исходный файл", поэтому вопрос о том, относится ли он к файловой системе, может зависеть от интерпретации. Предположительно, реализация могла бы создать "рукописную заметку, которую вы мне дали именно тогда", если это действительно идентифицирует "исходный файл" в этой реализации языка.


В заключение: да, источники называются стандартом "файлы", но что такое "файл" и задействована ли файловая система, не определено.

Другие вопросы по тегам