首先:如果之前有人问过这个问题,我很抱歉。我是一个聪明的谷歌人,但这真的把我难住了,我在上面找不到任何东西。
我目前正在写一个小型库,我想为它实现调试。我还希望能够完全关闭调试,编译后的代码不应该包含任何调试检查的痕迹。我用的是GCC和C99。
我知道我可以使用:
/* Method 1, guaranteed good */
#define DEBUG 0
#if DEBUG
/* Do debugging here */
#endif它完成了工作,并且在if和endif之间没有发生任何事情的痕迹,但我认为这看起来很丑陋。我在以下方面取得了一些成功:
/* Method 2, seems to be valid */
#define DEBUG 0
if (DEBUG && value_to_check) { /* More debugging here */ }在可读性方面,我更喜欢方法2。
我想知道的是,如果我使用方法2而不是久经考验的方法1,我是否会失去什么,或者如果我使用方法2而不是方法1,GCC会不会骗我?
发布于 2020-01-02 03:15:44
区别在于:
#if DEBUG
if(something_else)
{
some_code
}
#endif 如果未定义DEBUG或其值为,则不会编译和链接下一个if和some_code。
if (DEBUG && something_else)
{
some_code
}如果你的链接器没有丢弃死代码,那么这段代码将会被编译并且很可能被链接。因此,更好的方法是采用预处理器的方式,因为当DEBUG符号未定义或值为零(false)时,它可以保证不存在调试代码。
https://stackoverflow.com/questions/59555241
复制相似问题