В случае библиотечных функций некоторые компиляторы могут реализовывать эти функции как встроенные, что означает, что компилятор знает достаточно о функциях, чтобы заменить вызов константой во время компиляции. Будет ли это сделано, зависит от компилятора. На практике я часто замечаю, что некоторые компиляторы не хотят предварительно вычислять выражения с плавающей точкой во время компиляции, даже если они не связаны с вызовами функций.
В общем случае, как правило, они не рассчитываются и не могут быть вычислены во время компиляции, при условии, что компилятор просто недостаточно знает об этих функциях, чтобы иметь возможность вычислять их во время компиляции. Может быть, у них есть заметные побочные эффекты во время выполнения?
Некоторые компиляторы могут иметь нестандартные зависящие от компилятора расширения, которые позволяют пользователю предоставлять дополнительную информацию о функциях компилятору, чтобы компилятор мог лучше оптимизировать вызовы функций и даже выяснить, можно ли заменить данный вызов на предварительный расчет времени компиляции. Например, компилятор GCC поддерживает такие функции атрибуты (расширение, специфичное для GCC), как const
и pure
. Если аргументы известны во время компиляции, вызов функции с атрибутом const
теоретически может быть заменен предварительным вычислением во время компиляции. Хотя я не могу сказать, может ли GCC действительно сделать это.
В языке C ++ (даже если ваш вопрос помечен тегом C) запланированной новой функцией является спецификатор объявления constexpr
, который служит для аналогичной цели и должен иметь тот эффект, который вы описываете.