Зачем использовать «адрес функции == NULL» вместо «false»?

Просматривая среди некоторого устаревшего кода я нашел такую ​​функцию:

static inline bool EmptyFunc()
{
return (void*) EmptyFunc == NULL;
}

Какие отличия от этого:

static inline bool EmptyFunc()
{
return false;
}

Этот код был создан для компиляции на нескольких разных платформах, таких как PS2, Wii, ПК … Есть ли основания использовать первую функцию? Хотите улучшить оптимизацию или избежать странного неправильного поведения компилятора?

22

Решение

Семантически обе функции одинаковы: они всегда возвращают false *. Сложение первого выражения с постоянным значением «ложь» полностью разрешено стандартом, поскольку оно не изменит каких-либо наблюдаемых побочных эффектов (которых нет). Поскольку компилятор видит всю функцию, он также может оптимизировать любые вызовы к ней и заменить ее постоянным «ложным» значением.

То есть, в первой форме нет «общего» значения, и, скорее всего, это ошибка программиста. Единственная возможность состоит в том, что он использует какое-то специальное поведение (или дефект) в конкретном компиляторе / версии. С какой целью я не знаю, однако. Если вы хотите предотвратить встраивание с использованием специфичного для компилятора атрибута, это будет правильным подходом — все остальное может быть нарушено при изменении компилятора.

(* Это предполагает, что NULL никогда не определяется как EmptyFunc, что приведет к true будучи возвращенным.).

10

Другие решения

Строго говоря, указатель на функцию не может быть приведен к пустому указателю, что в этом случае выходит за рамки стандарта. Стандарт C11 перечисляет его как «общее расширение» в J.5.7 (я подозреваю, что то же самое относится и к C ++). Таким образом, единственное различие между этими двумя случаями в том, что первое не является переносимым.

Казалось бы, наиболее вероятной причиной предыдущей версии является либо запутанный программист, либо запутанный компилятор. Мы можем с уверенностью сказать, что программист был смущен / неаккуратен из-за отсутствия поясняющего комментария.

Не имеет особого смысла объявлять функцию как inline и затем попытайтесь обмануть компилятор, чтобы он не вставлял код, включив адрес функции в код. Поэтому я думаю, что мы можем исключить эту теорию, если, конечно, программист не растерялся и не подумал, что это имеет смысл.

3

По вопросам рекламы [email protected]