编译以下代码:
#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);
^
然而,如果FOO
是NULL
,由于if (FOO)
检查,strdup
将不会被调用。有没有什么方法可以避免这个警告?
谢谢!
if ((NULL)) foo = strdup((NULL));
,这很可能是错误的原因。strdup
需要一个不是NULL
的const char *
。 - bzeamanstrdup(NULL)
是无意义的,所以不必费心。警告是正确的。 - Jabberwocky-Wno-nonnull
将禁用警告。[GCC手册。](https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html) - user3920237strdup
的声明,您会发现在您的实现中它是使用__attribute__((nonnull (1)))
属性(或者__attribute__((nonnull))
)声明的。这并非偶然,而且如果不禁用非空属性检查,结果就是您现在得到的结果。 - WhozCraiggcc -Wall -Wextra -O
! - Basile StarynkevitchNULL
扩展为(void*)0
,预处理器会将其解释为数字。void
被替换为0
,所以#if
看到的是(0*)0
,这是一个语法错误。NULL
在预处理指令中不适用。 - Jens Gustedt