#define指令中的sizeof运算符

时间:2015-01-06 14:06:05

标签: c++ visual-c++ macros c-preprocessor

我一直在检查某人的代码,我遇到了这个:

#else //If not in Debug mode

#define LOG_WARNING(str) do { (void)sizeof(str); } while(0)
#define LOG_INFO(str) do { (void)sizeof(str); } while(0)

// ... More #define directives

#endif

显然,do { (void)sizeof(str); } while(0)是经过仔细编写的,因此编译器可以完全忽略该指令。

这是如何运作的?

1 个答案:

答案 0 :(得分:4)

sizeof的操作数是未评估的,因此这可确保在运行时无需执行任何工作。宏只是忽略一个常量值;编译器可以看到它没有效果,因此不应该从中生成代码。

完全不做任何事情的优点是编译器仍然检查参数是否是有效表达式;在更改代码并且仅编译发布时,您不会意外地破坏调试版本。

评论中提到的优于(void)str的优点是会评估表达式,编译器可能无法消除它,因为它可能存在副作用。例如:

extern std::string get_message(int code);
LOG_INFO(get_message(code));  // -> (void)get_message(code);
发布版本中的

将调用该函数并忽略结果,从而影响性能。