为什么使用'function address == NULL'而不是'false'?

Vyt*_*ius 22 c c++ deobfuscation

在一些遗留代码中浏览我发现了这样的功能:

static inline bool EmptyFunc()
{
    return (void*) EmptyFunc == NULL;
}
Run Code Online (Sandbox Code Playgroud)

与此有什么不同:

static inline bool EmptyFunc()
{
    return false;
}
Run Code Online (Sandbox Code Playgroud)

这段代码是为了在几个不同的平台上编译而创建的,比如PS2,Wii,PC ......有没有理由使用第一个函数?喜欢更好的优化还是避免一些奇怪的编译器错误行为?

edA*_*a-y 10

从语义上讲,两个函数都是相同的:它们总是返回false*.将第一个表达式折叠为常量值"false"是标准完全允许的,因为它不会改变任何可观察到的副作用(其中没有任何副作用).由于编译器可以看到整个函数,因此它也可以自由地优化掉对它的任何调用,并用常量"false"值替换它.

也就是说,第一种形式中没有"一般"值,并且可能是程序员的错误.唯一的可能性是它利用特定编译器/版本中的某些特殊行为(或缺陷).然而,到目前为止我还不知道.如果你希望使用特定于编译器的属性来防止内联是正确的方法 - 如果编译器改变,其他任何东西都容易破坏.

(*这假定NULL从未定义为EmptyFunc,这将导致true返回.).