6.6 如果 NULL 定义成 #define NULL ((char *)0)  难道不就可以向函数传入不加转换的 NULL 了吗?

一般情况下, 不行。复杂之处在于, 有的机器不同类型数据的指针有不同的内部 表达。这样的 NULL 定义对于接受字符指针的的函数没有问题, 但对于其它类型 的指针参数仍然有问题 (在缺少原型的情况下), 而合法的构造如
    FILE *fp = NULL;
则会失败。

不过, ANSI C 允许 NULL 的可选定义

    #define NULL ((void *)0)
除了潜在地帮助错误程序运行 (仅限于使用同样类型指针的机器, 因此帮助有限) 以外, 这样的定义还可以发现错误使用 NULL 的程序 (例如, 在实际需要使用 ASCII NUL 字符 的地方; 参见问题 5.7)。

无论如何, ANSI 函数原型确保大多数 (尽管不是全部; 参见问题 5.2)指针参 数在传入函数时正确转换。 因此, 这个问题有些多余。

参考资料: [Rationale, Sec. 4.1.5]。

翻译朱群英、孙云, LaTeX2HTML 编译 朱群英 (2005-06-23)