haker_fox 61 27 февраля, 2023 Опубликовано 27 февраля, 2023 · Жалоба Добрый день, коллеги! Не могу справиться сам в поиске ответа. Вернее, моё мнение есть, но есть и менение другого коллеги. Есть constexpr-функция constexpr Boot::version_type_t get() { constexpr char s_date[] = __DATE__; // always mmm dd yyyy constexpr char s_time[] = __TIME__; // always hh mm ss // тут алгоритм вычисления версии прибора по макросам __DATE__ и __TIME__ reuturn результат. } Тело функции расположено в заголовочном файле. Так вот, мой коллега утверждает, что значение функции будет вычислено и подставлено в качестве результата. И вызова функции не будет. Я проверил, так и есть. Но функции get() вызывается из разных единиц компиляции (*.cpp-файлов) и я подозреваю, что результат функции будет вычислен каждый раз в разный момент времени с разными значениями макросов __TIME__ и __DATE__, что приведёт к различным версиям в различных частях ПО. Возможно, что вопрос очень простой, но я что-то не соображаю, как проверить, или что почитать. Банальная проверка нескольких листингов показала, что результат одинаковый, но это могло произойти по причине компиляции нескольких исходников за в течение времени меньшей секунды, т.е. без изменения макроса __TIME__. Но вообще, хотелось бы не экспериментов, а точного, документированного ответа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 27 февраля, 2023 Опубликовано 27 февраля, 2023 · Жалоба Откомпилируйте файлы с интервалом > секунды и без pre header compilation. Всё увидите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 27 февраля, 2023 Опубликовано 27 февраля, 2023 · Жалоба 8 минут назад, haker_fox сказал: но я что-то не соображаю, как проверить, Скомпилировать проект. Изменить (добавить пробел или просто touch) один из файлов, в которых используется эта функция. Скомпилировать снова. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 27 февраля, 2023 Опубликовано 27 февраля, 2023 · Жалоба Да, действительно. Спасибо, коллеги. Что-то я затупил устал) Но всё же позволю себе немного больше, и уточню: а что-то в документации можно найти, чтобы получить 100% гарантированный ответ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 27 февраля, 2023 Опубликовано 27 февраля, 2023 · Жалоба https://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 27 февраля, 2023 Опубликовано 27 февраля, 2023 · Жалоба Чтобы функция вызывалась один раз, можно создать дополнительную constexpr-переменную, и присвоить ей результат вызова функции: static inline constexpr auto version = getVersion(); И затем из всех модулей не вызывать функцию, а использовать переменную version. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться