gpt4 book ai didi

c++ - #define 指令中的 sizeof 运算符

转载 作者:太空狗 更新时间:2023-10-29 20:58:23 25 4
gpt4 key购买 nike

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

#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

显然,做 { (void)sizeof(str); } while(0) 编写得非常仔细,因此编译器可以完全忽略该指令。

这是如何工作的?

最佳答案

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

与什么都不做相比的优势在于编译器仍然会检查参数是否是一个有效的表达式;更改代码并仅为发布进行编译时,您不会意外破坏调试版本。

评论中提到的 (void)str 的优势在于,它会计算表达式,并且编译器可能无法消除它,因为它可能有副作用。例如:

extern std::string get_message(int code);
LOG_INFO(get_message(code)); // -> (void)get_message(code);

在发布版本中会调用该函数并忽略结果,从而影响性能。

关于c++ - #define 指令中的 sizeof 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27800343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com