objc sendMsg函式原型修改了

2021-10-03 07:25:22 字數 964 閱讀 8480

公升級mac系統到10.15.1之後,發現有一處**編譯不過。發現是使用了objc_sendmsg,但是在2019.10左右,mac os x系統中把這個方法原型修改了。原本是帶引數的,現在直接改為void objc_sendmsg(void)了。但是,仍然可以傳引數。具體參考 :

objc_msgsend』s new prototype 這篇文章介紹了為什麼能改變函式原型,這裡面提到函式呼叫的實現細節,以及abi方面的東西。

abi在理解的時候可以借助我們熟悉的api。

api是原始碼級別的約定,比如引數,返回值,以及一些屬性,比如是否可以繼承。這個是由編譯器定義約束的。

但是c/c++標準中都沒有定義abi,參考quora上乙個問題 why is c++ abi not as good as c abi? dan allen的乙個回答,注意別被標題誤導,c/c++都沒有定義abi。之前在研究如何讓自定義c++型別成為atomic的時候,發現為了滿足這一條件,c++做了很多看起來很彆扭的約定,而且還在不同版本的標準中變化,比如:乙個c++類是否是standard layout,是否是trivial class,是否是pod(而且還不同於c中的pod,真讓人頭暈)。估計(猜測,不想深究了)跟abi也有一定的關係。

casting objective-c message sends,這篇文章介紹了如何修改較好。

#if defined(q_os_osx)

#include #include // ref:

bool dockclickhandler(id self,sel _cmd,...);

void setupdockclickhandler() else

}else else }}

}bool dockclickhandler(id self,sel _cmd,...)

return false;

}#endif

memset函式原型

memset cpp view plain copy print void cb memset void buffer,intb,size tsize return retaddr void cb memset void buffer,int b,size t size returnretaddr ...

strcpy函式原型

char strcpy char strdest,const char strsrc strcpy的函式宣告 cpp view plain copy print?char strcpy char strdest,const char strsrc 1.為了保護原字串不被修改,傳入的原字串用 cons...

C 函式原型

一,函式原型 函式原型 函式宣告 就是告訴編譯器這個函式是存在的,讓編譯器知道這個函式的相關資訊。函式原型不要求提供形參名,有型別列表就可以了。避免使用函式原型的方法是,在首次使用函式定義之前定義它,但這並不是總可行的。我們一般把函式宣告放在主函式的前面,因為min 函式是應用程式的入口。函式宣告是...