ISO C标准中函数指针参数的函数表示法语义是否有标准依据?
关于C语言函数参数中函数表示法的标准定义与语义说明
这两个函数声明在C标准中完全等价,标准并没有赋予函数表示法“禁止传入空函数指针”的特殊语义,《Modern C》里的说法属于开发者之间的代码风格约定,而非标准层面的明确定义。
具体说明如下:
- 按照C标准(包括你查阅的3220n版草稿)的规则,当函数参数被声明为函数类型时,编译器会自动将其调整为对应的函数指针类型。也就是说
void handler(void)作为参数,和void(*handler)(void)是完全一致的,编译器会把前者等价处理为后者。 - 你用GCC trunk编译无警告,正是因为这两个声明是兼容的,编译器判定它们是同一个函数的重复声明,不存在冲突。
- 《Modern C》中提到的“语义上强调不允许空指针”,是作者推荐的一种编码习惯:用函数表示法来暗示调用者该参数不能传入NULL,用指针表示法则允许传入NULL。但这只是一种约定俗成的代码提示,没有标准强制约束,编译器也不会因为使用了函数表示法就自动检查参数是否为NULL。
内容的提问来源于stack exchange,提问作者Fabio
相关产品推荐
相关产品推荐

