gpt4 book ai didi

c - 如何避免 "null argument where non-null required"编译器警告

转载 作者:太空狗 更新时间:2023-10-29 15:02:14 29 4
gpt4 key购买 nike

编译以下代码:

#include <string.h>
#define FOO (NULL)

int main(int argc, char *argv[])
{
char *foo;

if (FOO)
foo = strdup(FOO);

return 0;
}

导致以下编译器警告:

foo.c: In function ‘main’:
foo.c:9:3: warning: null argument where non-null required (argument 1) [-Wnonnull]
foo = strdup(FOO);
^

但是,如果 FOONULL,则不会调用 strdup,因为 if (FOO)查看。有什么办法可以避免这个警告吗?

谢谢!

最佳答案

您是正确的,您已使用子句保护 strdup 的调用,以确保永远不会使用 NULL 参数调用 strdup

但是编译器中为函数调用发出警告的部分与知道调用永远不会发生的部分不同。

您可能会用一个确保生成的参数表达式永远不会是 NULL 的表达式来掩盖 NULL

例如

if (FOO) foo = strdup(FOO?FOO:"");

if (FOO) foo = strdup(FOO + !FOO);

这是“清楚的”(至少对编译器而言)strdup 不能用 NULL 值调用,并且您的 if子句确保永远不会使用不再是 NULL 值的值调用它。

在这一点上我们挥挥手说编译器会把它优化掉,为了帮助我们直观地优化它,我们有:

#define NON_NULL(x) ((x)?(x):"")

对于调试版本,类似于:

#define NON_NULL(x) ((x)?(x):(abort(),""))

我们可能会使用 GNU 扩展 ?:(可选的缺失中间子句默认为第一个子句)来避免多次计算 (x)

#define NON_NULL(x) ((x)?:"")

对于调试版本,类似于:

#define NON_NULL(x) ((x)?:(abort(),"")

现在您可以展示一些技术上更晦涩但显然更有意义的东西:

if (FOO) foo = strdup(NON_NULL(FOO));

并假装 NON_NULL 是一些正式的符号和确认。

关于c - 如何避免 "null argument where non-null required"编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26508000/

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