如何用 ANSI C 编写 pre ANSI-C“0 指针”?
How shall pre ANSI-C "0 pointers" be written in 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
这只是一种指定类型化空指针的方法,而不是 stdlib.h 中更常见的 NULL,它具有 void* 类型,与 K&R C 中指定的方式参数完全没有关系。
sp != (Symbol *)0
在ANSI/ISOC中仍然完全有效。任何值为0的整数常量表达式都可以用作空指针常量(C17 6.3.2.3(3)),并且可以是转换为任何指针类型,导致该类型的空指针。所以只要 sp
不是空指针,这就简单地重复循环。
改写成sp != NULL
可能更常规一点,但没必要。如果你喜欢简洁,你也可以简单地写
for(sp=symlist; sp; sp = sp->next)
我正在阅读一些旧代码,并且正在寻找类似这样的结构:
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
这只是一种指定类型化空指针的方法,而不是 stdlib.h 中更常见的 NULL,它具有 void* 类型,与 K&R C 中指定的方式参数完全没有关系。
sp != (Symbol *)0
在ANSI/ISOC中仍然完全有效。任何值为0的整数常量表达式都可以用作空指针常量(C17 6.3.2.3(3)),并且可以是转换为任何指针类型,导致该类型的空指针。所以只要 sp
不是空指针,这就简单地重复循环。
改写成sp != NULL
可能更常规一点,但没必要。如果你喜欢简洁,你也可以简单地写
for(sp=symlist; sp; sp = sp->next)