ANSI-C之前的"0 pointers"应该如何用ANSI C编写?



我正在阅读一些旧代码,我发现了像这样的结构:

Symbol *lookup(s)
char *s;
{
Symbol *sp;
for(sp=symlist; sp!= (Symbol *)0; sp = sp->next)
if(strcmp(sp->name, s) == 0)
return sp;
return 0;
}

我知道参数可以通过以下方式在ANSI C中指定:

Symbol *lookup(char *s) {
...
}

但我想知道如何处理0指针:

(Symbol *) 0

sp != (Symbol *)0在ANSI/ISO C中仍然完全有效。任何值为0的整数常量表达式都可以用作空指针常量(C17 6.3.2.3(3((,并且可以强制转换为任何指针类型,从而生成该类型的空指针。因此,只要sp不是空指针,这就简单地重复循环。

将其重写为sp != NULL可能有点传统,但这不是必须的。如果你喜欢简洁,你也可以简单地写

for(sp=symlist; sp; sp = sp->next)

这只是一种指定类型化空指针的方法,而不是来自stdlib.h的更常见的null,它具有void*类型,与K&R C.

最新更新