转换调用objc_msgSend为何不触发未定义行为?其实现机制是什么?
关于objc_msgSend动态适配参数与返回值的疑问
背景
我在纯C代码中观察到使用objc_msgSend向Objective-C的id类型发送消息的用法,相关文档记录并不完善,但找到了实际的使用示例。示例中通过宏定义了多种不同的函数指针类型来调用objc_msgSend:
#define msg ((id (*)(id, SEL))objc_msgSend) #define msg_int ((id (*)(id, SEL, int))objc_msgSend) #define msg_id ((id (*)(id, SEL, id))objc_msgSend) #define msg_ptr ((id (*)(id, SEL, void*))objc_msgSend) #define msg_cls ((id (*)(Class, SEL))objc_msgSend) #define msg_cls_chr ((id (*)(Class, SEL, char*))objc_msgSend)
可以看到,这些宏将objc_msgSend转换为带有不同参数列表和返回值的函数指针后进行调用。
核心疑问
我之前了解到,将函数指针转换为不同签名的类型后调用属于未定义行为。但objc_msgSend作为C语言可调用的函数,却能动态适配各种参数列表和返回类型,这是如何实现的?为什么这种操作不会触发未定义行为?
内容的提问来源于stack exchange,提问作者CPlus
相关产品推荐
相关产品推荐

