我一直在检查某人的代码,我遇到了这个:
#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)
是经过仔细编写的,因此编译器可以完全忽略该指令。
这是如何运作的?
答案 0 :(得分:4)
sizeof
的操作数是未评估的,因此这可确保在运行时无需执行任何工作。宏只是忽略一个常量值;编译器可以看到它没有效果,因此不应该从中生成代码。
完全不做任何事情的优点是编译器仍然检查参数是否是有效表达式;在更改代码并且仅编译发布时,您不会意外地破坏调试版本。
评论中提到的优于(void)str
的优点是会评估表达式,编译器可能无法消除它,因为它可能存在副作用。例如:
extern std::string get_message(int code);
LOG_INFO(get_message(code)); // -> (void)get_message(code);
发布版本中的将调用该函数并忽略结果,从而影响性能。