prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 5.11

Q我曾经用过一个编译器,它不工作,除非NULL没有被使用,它就无法工作。


A除非被编译的代码是不可移植的,否则该编译器很可能是有问题的。

也许代码使用了类似问题5.2中的不可移植示例的写法

	execl("/bin/sh", "sh", "-c", "date", NULL);	/* WRONG */
在定义了NULL((void *)0)(参见问题5.6)的编译器下,这段代码恰好可以工作。[脚注] 但是,如果指针和整数的大小或表示方式不同,(同样不正确的)代码
	execl("/bin/sh", "sh", "-c", "date", 0);	/* WRONG */
可能无法工作。

正确的、可移植的代码使用显式转换

	execl("/bin/sh", "sh", "-c", "date", (char *)NULL);
通过转换,无论机器的整数和指针表示方式如何,也无论编译器选择哪种形式的空指针常量来定义NULL。 (问题5.2中的代码片段,使用0而不是NULL,同样是正确的;另请参阅问题5.9。) (一般来说,基于特定编译器行为来做关于语言的决定很可能是适得其反的。)


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管