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。) (一般来说,基于特定编译器行为来做关于语言的决定很可能是适得其反的。)