繁体   English   中英

隐式函数指针转换

[英]Implicit function-pointer conversions

根据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标准中有什么可以保证这种行为的,还是仅仅是扩展?

转换的隐含性得到保证。

6.5.16.1p1指出,如果(除其他事项外) “ ...两个操作数都是指向兼容类型的合格或不合格版本的指针...” (“ ...,以及左侧所指向的类型,则赋值有效具有右侧所指类型的所有限定符”)。

6.7.6.3p15使功能类型兼容:

为了使两种功能类型兼容,两者都应指定兼容的返回类型。146)此外,如果同时存在参数类型列表,则应在参数数量和省略号终止符的使用上达成一致; 相应的参数应具有兼容的类型。 如果一种类型具有参数类型列表,而另一种类型由不属于函数定义一部分且包含空标识符列表的函数声明符指定,则该参数列表不应具有省略号终止符,并且每个参数的类型均应为与应用默认参数提升的结果类型兼容。 如果一种类型具有参数类型列表,而另一种类型由包含(可能为空)标识符列表的函数定义指定,则两者应在参数数量上达成一致,并且每个原型参数的类型均应与该类型兼容这是由于将默认参数提升应用到相应标识符的类型而导致的。 (在确定类型兼容性和复合类型时,将使用函数或数组类型声明的每个参数视为已调整类型,将使用限定类型声明的每个参数视为具有其声明类型的非限定版本。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM