【发布时间】:2018-09-25 14:51:16
【问题描述】:
根据 tcc、gcc 和 clang 的经验,一个指向
返回 RetTp 的旧式函数和指向任何原型的指针
返回RetTp 的函数可以相互隐式转换:
//compiles without warnings
typedef void RetTp;
RetTp oldfn(){};
RetTp newfn(int X){};
RetTp (*oldfnp)() = newfn;
RetTp (*newfnp)(int X) = oldfn;
C 标准中有什么东西可以保证这种行为还是只是一个扩展?
【问题讨论】:
-
调用是一样的。唯一的问题是如何正确传递参数。当你打电话给他们时,你可能会收到警告。顺便说一句,您已关闭警告 - 您没有返回并且有未使用的参数
-
RetTp oldfn(){};-->>RetTp oldfn(void){}; -
C 2011 [N1570] 6.5.16.1 1 列出了赋值表达式的约束,第三个约束适用于函数指针,要求它们兼容。 6.7.6.3 15 指定了使函数类型兼容的原因,但是我现在写答案太复杂了。它确实允许具有参数列表的类型与没有参数列表的类型兼容,前提是满足某些条件。
-
据我所知,根据 N1570 应该没问题。但是,您应该知道,如果您将旧式声明与包含参数类型列表的函数定义混合使用,您应该尽量坚持使用
int和double。将 32 位int传递给需要 64 位longcan cause problems for example 的函数。从理论上讲,这只是 UB 在起作用,但实际上,这是原型存在的原因,也是我们应该尽可能使用它们的原因。
标签: c language-lawyer