在学校里,我经常被告知预处理器语句很容易出错,因为您定义的字符串,例如:
#define PI 3.1415926
在代码中的每个位置都被替换,当变量名包含字符串时会导致奇怪的替换PI
。
因此,在调试时,我会避开以下方法:
#define _DEBUG
...
#ifdef _DEBUG
// debug code
#endif
...
但坚持使用它会“更安全”:
const static bool DEBUG = true
int main()
{
...
if(DEBUG){ /* debug code*/ }
...
}
这很好用,但我想知道,与预处理器语句方法相比,这种方法的运行时开销是什么?使用预处理器方法,一切都发生在编译之前,因此不会出现运行时开销。
我知道一个简单的if
-statement 的开销几乎可以忽略不计,但是当它深入到一些运行大量时间的嵌套循环中时,这并不成立(小事加起来就是大事)。
DEBUG
编译器是否识别出事实const static
并将其硬编码到可执行文件中,已经在编译时启用或禁用调试代码?让我怀疑的是,前几天,在处理一些不相关的代码时,编译器警告我代码的某些部分已经过时,因为if
围绕它的 -statement 永远不会成为真的(如果我没记错的话)。