Являются функциями constexpr, которые загружают файлы в С++?

96
12

Здесь был аналогичный вопрос , но у него не было никакой важной информации, поэтому я хочу снова спросить об этом - можно ли загружать содержимое произвольного файла с помощью constexpr функция? Я знаю, что это кажется невозможным, поскольку все возможные функции, позволяющие ввод/вывод файлов (fopen, open...) не constexpr, поэтому не могут быть вызваны в этом сценарии. Однако, поскольку здесь много людей, которые следуют разработке С++ 17 и дальше, есть ли надежда на то, что дополнительные стандарты будут включать в себя некоторый API ввода-вывода файлов, который будет constexpr и может быть использован для загрузки файла на время компиляции?


Просто для сравнения - Haxe позволяет делать почти все с помощью макросов времени компиляции, поэтому было бы очень здорово иметь что-то подобное на С++. Например, генерирование экземпляров класса путем десериализации файлов.

спросил(а) 2016-03-02T12:57:00+03:00 5 лет назад
1
Решение
113

Это (по крайней мере, для меня) типичный случай чрезмерного усложнения при переходе между языками.
Да, вы могли бы реализовать функциональность, чтобы добавить загрузку файла времени компиляции в С++, мы также могли бы добавить отражение во время выполнения. Однако, на мой взгляд, они не нужны и не нужны функции.


Если у вас есть умение писать программу, которая нуждается в constexpr, вы можете понять концепцию событий предварительной сборки (использовать терминологию Microsoft), если вы сможете читать файл, вы должны быть достаточно способный писать код для анализа файлов в другие форматы.


В этой ситуации решение времени компиляции должно написать автономное средство, которое будет анализировать данный файл и генерировать файл .h(header), содержащий требуемые константы и оценки этих констант. Этот инструмент можно запустить до запуска процесса сборки.


Таким образом, ваш constexpr становится именно таким, постоянное выражение


Возьмем пример "номера версии программы", общим решением является создание IDE разработчиков или автономного инструмента, создающего заголовочный файл, содержащий константные значения, являющиеся версией программного обеспечения.


Многие программные средства FOSS содержат такие функциональные возможности в своих сценариях ./configure - разбор текущего номера версии из Git или аналогичного - что означает, что любая встроенная версия программного обеспечения может выводить номер сборки, позволяя отслеживать проблемы.


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


Однако мы не должны попадать в ловушку, пытаясь добавить к нему всевозможные возможности, чтобы угодить всем. ~ Bjarn Stroustrup



В условиях неспециалиста это было бы похоже на продажу пускового велосипеда вместе с шлемом одного размера и велосипедными шортами (которые пользователь должен использовать на законных основаниях). Он может соответствовать потребностям большинства пользователей, но попытка вписаться в шорты с моей талией будет... проблематичной.


Представьте сложность, добавленную для кросс-компиляторов между архитектурами, встроенными системами и т.д.


[править/]

Это не идеальный ответ - и в какой-то степени основан на мнениях; То, что я пытаюсь предоставить, - это понимание того, что, хотя большинство пользователей ориентированы на настольные системы, добавление чего-то вроде этого значительно усложнит разработку компилятора для встроенных систем и других приложений. И это то, чего пытается избежать С++.


Некоторое свечение


[edit 2/]

В комментариях было указано: "Почему бы просто не добавить компилятор содержимого файла как char *, и это отличный вопрос! В этом отношении у меня есть два момента для повышения.


    Вы собираетесь проанализировать, что char* в constantexp? Если да, то вам понадобится цикл, а переменные - то, что вы не можете использовать надежно.
    Если вам нужен строковый литерал содержимого файла - это не очень, но препроцессор С++ может сделать это (при условии, что формат файла не содержит недопустимых символов).

И снова - что-то более сложное, чем эти простые примеры становится достаточно сложным, чтобы быть жестким до определить в стандарте, должен ли файл быть двоичным? должен ли он быть текстом? Каковы линии окончания? должен ли он разбираться?


В то же время вы можете легко использовать существующие инструменты, даже делая это в сочетании с другими методами.
Например, напишите инструмент, который будет анализировать ваш двоичный файл, перекодировать его как последовательность управляющих последовательностей (например: \0x0, \0x12, \0x22), автоматически добавить в файл заголовка, определяющий указатель на указанные данные. Затем #include этот заголовок - у вас есть то, что вы хотите, для платформ, над которыми вы работаете, и не создавали лазейки в стандарте С++, которые могут вызвать присущая сложность.


Пожалуйста, помните, что С++ как язык, наконец, восстанавливается из очень длительного периода Very Bad Press. И компиляторы, которые по сей день все еще действуют полностью, по-другому в некоторых случаях.

На мой взгляд, каждый программист на С++ хочет мир, в котором я могу написать свой "идеально ориентированный на объект код С++ один раз", а затем он будет работать на всем, начиная с телефона Nokia 1990 года и заканчивая последним квантово-оптическим униваком, И наконец, мы немного приближаемся к этому, чтобы доказать ценность С++ для более широкого мира. Увольнение нашего луча смертельной звезды на Java или какое-то провокационное выражение.


Таким образом, я говорю: идея хорошая, но не нужна. Конечно, если вы хотите написать Полное предложение, изложив, как вы избежите любых проблем, которые могут повредить будущему С++ - Utopia, Я прошу вас сделать это. Если такая функция может быть выполнена без ущерба для предварительного процессора, независимости от платформы, создайте Невозможно сложные ошибки или аналогичные. Тогда вы бы умнее меня, потому что я не могу понять, как это возможно в настоящее время.

ответил(а) 2016-03-02T13:14:00+03:00 5 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема