3 回答
TA贡献1875条经验 获得超3个赞
在下列情况下未对行为进行定义:
指针用于调用其类型与指向类型不兼容的函数(6.3.2.3)。
指向一种类型的函数的指针可以转换为指向另一种类型的函数的指针,然后再转换回来;结果应该与原始指针相比较。如果转换后的指针用于调用其类型与指向类型不兼容的函数,则该行为是未定义的。
对于两个函数类型是兼容的,两者都应该指定兼容的返回类型。 127.
此外,参数类型列表(如果两者都存在)应在参数的数量和使用省略号终止符方面达成一致;相应的参数应具有兼容的类型。如果一个类型有一个参数类型列表,而另一个类型是由一个函数声明器指定的,它不是函数定义的一部分,并且包含一个空的标识符列表,则该参数列表不应该有一个省略终止符,并且每个参数的类型都应该与应用默认参数提升所产生的类型兼容。如果一种类型具有参数类型列表,而另一种类型是由包含(可能为空)标识符列表的函数定义指定的,则两者应在参数数量上达成一致,并且每个原型参数的类型应与应用默认参数提升到相应标识符类型所产生的类型兼容。(在确定类型兼容性和组合类型时,以函数或数组类型声明的每个参数被视为具有已调整类型,而以限定类型声明的每个参数被视为具有其声明类型的不合格版本)。
127)如果两种函数类型都是“旧样式”,则不对参数类型进行比较。
如果两种指针类型是兼容的,两者都应该是相同限定的,并且两者都应该是指向兼容类型的指针。
void*
struct my_struct*
void (*)(void*)
void (*)(struct my_struct*)
在不同调用约定的函数指针之间进行转换。你会把堆栈搞砸,充其量,崩溃,最坏的情况是,在一个巨大的安全漏洞中默默地成功。在Windows编程中,您经常传递函数指针。Win 32要求所有回调函数使用 stdcall
调用约定(其中宏 CALLBACK
,PASCAL
,和 WINAPI
全部扩展到)。如果传递使用标准C调用约定的函数指针( cdecl
),坏就会发生。 在C+中,在类成员函数指针和规则函数指针之间进行转换。这经常会引起C+新手的注意。类成员函数有一个隐藏的 this
参数,如果将成员函数强制转换为常规函数,则不存在 this
对象,同样会产生许多不好的结果。
函数指针和常规指针之间的转换(例如,将 void (*)(void)
转到 void*
)。函数指针不一定与常规指针大小相同,因为在某些体系结构中,它们可能包含额外的上下文信息。这可能会在x86上正常工作,但请记住,它是未定义的行为。
TA贡献1877条经验 获得超6个赞
结构、联合或枚举类型声明在两个不同的翻译单元中不会正式声明相同的类型,即使这些声明的文本来自相同的包含文件,因为翻译单元本身是不相交的。因此,标准为这类型指定了额外的兼容性规则,以便如果两个此类声明非常相似,则它们是兼容的。
void*
void*
- 3 回答
- 0 关注
- 563 浏览
添加回答
举报