在浏览一些旧代码时,我发现了这样的函数:
static inline bool EmptyFunc()
{
return (void*) EmptyFunc == NULL;
}
这个跟那个有什么不同:
static inline bool EmptyFunc()
{
return false;
}
这段代码被创建用于在多种平台上编译,如PS2、Wii和PC等... 是否有使用第一个函数的理由?例如更好的优化或避免一些奇怪的编译器错误?
在浏览一些旧代码时,我发现了这样的函数:
static inline bool EmptyFunc()
{
return (void*) EmptyFunc == NULL;
}
这个跟那个有什么不同:
static inline bool EmptyFunc()
{
return false;
}
这段代码被创建用于在多种平台上编译,如PS2、Wii和PC等... 是否有使用第一个函数的理由?例如更好的优化或避免一些奇怪的编译器错误?
从语义上来说,这两个函数是相同的:它们总是返回false*。将第一个表达式折叠为常量值"false"完全符合标准,因为这不会改变任何可观察的副作用(其中没有任何副作用)。由于编译器看到整个函数,它也可以自由地优化掉对它的任何调用,并将其替换为常量"false"值。
也就是说,第一种形式没有“通用”值,很可能是程序员犯的错误。唯一的可能性是它利用了特定编译器/版本中的某些特殊行为(或缺陷)。然而,我不知道它的目的是什么。如果您希望防止内联使用特定于编译器的属性将是正确的方法-其他任何方法都容易在编译器更改时出现问题。
(*这假设 NULL
从未定义为 EmptyFunc
,否则将返回 true
)。
inline
,然后试图通过在代码中包含函数地址来欺骗编译器不进行内联代码并没有什么意义。因此,我认为我们可以排除这个理论,除非当然程序员混淆并认为这是有意义的。
false
,编译器可以自由地优化掉那个函数...但是任何实际使用它的地方都应该防止同样的优化。嗯,EmptyFunc
在哪里被使用?另外,为什么要将函数指针强制转换成void*
?这对函数指针来说没有意义... - Cameron