c - 禁用 "warning: the address of ' x' 将始终评估为 'true' "

标签 c gcc macros compiler-warnings suppress-warnings

问题是这样的:

#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/

相关文章:

java - 从 C 文件中提取 int 数组

gcc - MSYS2 GCC 在禁用 SSE 的情况下将浮点运算的双倍归零

c++ - C和C++中寄存器变量的地址

scala - 用户包含 scalamacros paradise 的最简单方法

linux - 有没有工具可以删除未定义宏中的 C 源代码?

c - 哈希表覆盖

c - 源代码到目标文件的映射

c - Linux C 如何打开目录并获取文件描述符

c - C 中的宏条件语句

无法在 Gnu-Make 中禁用 "default"后缀规则