Подтвердить что ты не робот

Зачем использовать 'function address == NULL' вместо 'false'?

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

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

В чем отличия от этого:

static inline bool EmptyFunc()
{
    return false;
}

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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