Просматривая среди некоторого устаревшего кода я нашел такую функцию:
static inline bool EmptyFunc()
{
return (void*) EmptyFunc == NULL;
}
Какие отличия от этого:
static inline bool EmptyFunc()
{
return false;
}
Этот код был создан для компиляции на нескольких разных платформах, таких как PS2, Wii, ПК … Есть ли основания использовать первую функцию? Хотите улучшить оптимизацию или избежать странного неправильного поведения компилятора?
Семантически обе функции одинаковы: они всегда возвращают false *. Сложение первого выражения с постоянным значением «ложь» полностью разрешено стандартом, поскольку оно не изменит каких-либо наблюдаемых побочных эффектов (которых нет). Поскольку компилятор видит всю функцию, он также может оптимизировать любые вызовы к ней и заменить ее постоянным «ложным» значением.
То есть, в первой форме нет «общего» значения, и, скорее всего, это ошибка программиста. Единственная возможность состоит в том, что он использует какое-то специальное поведение (или дефект) в конкретном компиляторе / версии. С какой целью я не знаю, однако. Если вы хотите предотвратить встраивание с использованием специфичного для компилятора атрибута, это будет правильным подходом — все остальное может быть нарушено при изменении компилятора.
(* Это предполагает, что NULL
никогда не определяется как EmptyFunc
, что приведет к true
будучи возвращенным.).
Строго говоря, указатель на функцию не может быть приведен к пустому указателю, что в этом случае выходит за рамки стандарта. Стандарт C11 перечисляет его как «общее расширение» в J.5.7 (я подозреваю, что то же самое относится и к C ++). Таким образом, единственное различие между этими двумя случаями в том, что первое не является переносимым.
Казалось бы, наиболее вероятной причиной предыдущей версии является либо запутанный программист, либо запутанный компилятор. Мы можем с уверенностью сказать, что программист был смущен / неаккуратен из-за отсутствия поясняющего комментария.
Не имеет особого смысла объявлять функцию как inline
и затем попытайтесь обмануть компилятор, чтобы он не вставлял код, включив адрес функции в код. Поэтому я думаю, что мы можем исключить эту теорию, если, конечно, программист не растерялся и не подумал, что это имеет смысл.