Q如果NULL定义如下:
#define NULL ((char *)0)那么传递未转换的NULL的函数调用是否会工作?
A在最一般的情况下不行。复杂之处在于,有些机器对不同类型数据的指针使用不同的内部表示。建议的定义将使未强制转换的NULL指向字符的指针作为函数参数能正常工作,但在没有原型的情况下,其他类型的指针参数仍可能需要显式转换。此外,合法的构造,例如
FILE *fp = NULL;可能会失败。
尽管如此,ANSI C 允许采用替代定义
#define NULL ((void *)0)对于NULL。 [脚注] 除了可能帮助错误程序运行(但仅限于指针同质的机器,因此其有效性值得怀疑),这个定义还可以捕捉到错误使用NULL的程序(例如,当实际上意图是 ASCII NUL 字符时;请参见问题 5.9)。另请参见问题 5.7。
无论如何,ANSI 函数原型确保了大多数(虽然不是全部;请参见问题 5.2)指针参数在作为函数参数传递时都能正确转换,因此这个问题在很大程度上已经无关紧要了。
习惯了现代“扁平”内存架构的程序员可能很难接受“不同种类的指针”这个概念。请参见问题 5.17 中的一些示例。
参考文献:Rationale 第 4.1.5 节