Требует ли С++ 20 хранения исходного кода в файлах? - программирование
Подтвердить что ты не робот

Требует ли С++ 20 хранения исходного кода в файлах?

Немного странный вопрос, однако, если я правильно помню, исходный код C++ не требует файловой системы для хранения своих файлов.

Наличие компилятора, который сканирует рукописные документы через камеру, будет соответствующей реализацией. Хотя практически не имеет особого смысла.

Однако C++ 20 теперь добавляет местоположение источника с помощью file_name. Означает ли это, что исходный код всегда должен храниться в файле?

4b9b3361

Ответ 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] гласит:

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

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

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

Ответ 2

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

__FILE__

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

Определение source_location::file_name такое же.

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

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


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