隐式函数指针转换

时间:2018-04-15 22:57:00

标签: c language-lawyer

根据经验,在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标准中是否有任何保证此类行为的内容或仅仅是一种扩展?

1 个答案:

答案 0 :(得分:0)

保证转换的隐含性。

6.5.16.1p1声明如果(除其他事项外)&#34; ...两个操作数指向兼容类型的限定或非限定版本的指针,则赋值有效...&#34; < / em>(&#34; ...,并且左边指向的类型具有右边指向的类型的所有限定符&#34;)。

6.7.6.3p15使函数类型兼容:

  

要兼容两种功能类型,两者都应指定   兼容的返回类型.146)此外,参数类型列出,如果   两者均存在,应在参数数量和使用中达成一致   省略号终结符;相应的参数应具备   兼容类型。如果一个类型有参数类型列表而另一个类型   type由函数声明符指定,该函数声明符不是a的一部分   函数定义和包含空标识符列表的   参数列表不应有省略号终结符和类型   每个参数应与由此产生的类型兼容   应用默认参数促销。如果一种类型有   参数类型列表和另一种类型由函数指定   包含(可能为空)标识符列表的定义   应同意参数的数量和每个参数的类型   prototype参数应与结果类型兼容   从应用默认参数促销到类型   相应的标识符。 (在确定类型   兼容性和复合类型,每个参数声明   函数或数组类型被视为具有调整类型和每个类型   使用限定类型声明的参数被视为具有   声明类型的非限定版本。)