问题是这样的:
#define do_stuff(ret) ((ret) ? getstuff(ret) : 0)
int var;
do_stuff(&var);
test.h:34:46: warning: the address of 'var' will always evaluate as 'true' [-Waddress]
do_stuff
充当接受可以为 NULL 的输出指针的函数,因此警告没有帮助但很烦人。
有没有办法通过代码让 gcc 停止提示?也许是(至少是一种)可移植的?
顺便说一句。 do_stuff
必须是一个宏,因为 ret
实际上是以通用方式设置的(为简单起见,此处已删除)。
编辑: 同样,我只想拥有可以为 NULL 的常用输出指针,但在宏而不是函数中。实际代码如下所示:
#define retrieve(x, ret) \
( ret ? (*ret = x.buf[0], 1) : 0 )
当像 retrieve(stuff, NULL)
这样使用它时,上面给出了警告。根据 Adriano Repetti 的回答,我将其更改为:
#define retrieve(x, ret) \
( ((void *)ret != NULL) ? (*ret = x.buf[0], 1) : 0 )
这有效,但现在给了我 warning: dereferencing 'void *' pointer
as this gets expanded to ( ((void *)NULL != NULL) ? (*NULL = x .buf[0], 1) : 0 )
。有什么方法可以消除这个警告吗?
retrieve
必须是一个宏,因为x.buf是variant类型,ret
也是,通过一个函数传递它在 2501 的提示中会导致类型丢失。
最佳答案
假设你真的无法避免宏并且考虑到我不会禁用警告(即使这个特定的警告不是危险的)那么我会作弊 带有一些转换的编译器。代码将是可移植的,并且不会发出警告:
#define do_stuff(ret) (((uintptr_t)NULL != (uintptr_t)ret) ? getstuff(ret) : 0)
这里的中心点很简单:(uintptr_t)NULL != (uintptr_t)ret
。我建议也阅读 this post在这里。请注意,也只需 NULL != (void*)ret
即可。
关于c - 禁用 "warning: the address of ' x' 将始终评估为 'true' ",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27048171/