Перейти к содержанию
    

constexpr функция в заголовочном файле

Добрый день, коллеги!

 

Не могу справиться сам в поиске ответа. Вернее, моё мнение есть, но есть и менение другого коллеги. Есть 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__. Но вообще, хотелось бы не экспериментов, а точного, документированного ответа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Откомпилируйте файлы с интервалом > секунды и без pre header compilation.
Всё увидите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 минут назад, haker_fox сказал:

но я что-то не соображаю, как проверить,

Скомпилировать проект. Изменить (добавить пробел или просто touch) один из файлов, в которых используется эта функция. Скомпилировать снова.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, действительно. Спасибо, коллеги. Что-то я затупил устал)

Но всё же позволю себе немного больше, и уточню: а что-то в документации можно найти, чтобы получить 100% гарантированный ответ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы функция вызывалась один раз, можно создать дополнительную constexpr-переменную, и присвоить ей результат вызова функции:

static inline constexpr auto version = getVersion();

И затем из всех модулей не вызывать функцию, а использовать переменную version.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...