諸位周知,qt 使用的不是標準的c++ 語言,而是對其進行了一定程度的「擴充」。為什麼這樣說呢?
這一點我們從qt新增加的關鍵字就可以看出來:signal、slots 或者 emit。
所以有人會覺得qt
的程式編譯速度慢,這主要是因為在 qt 將源**交給標準 c++ 編譯器之前,需要事先將這些擴充套件
的語法去除掉。
而完成這一操作的工具就是所謂的moc。
moc 全稱是 meta-object compiler,也就是「元物件編譯器」。
qt 程式在交由標準編譯器編譯之前,先要使用 moc 分析 c++ 原始檔。
如果它發現在乙個標頭檔案中
包含了巨集 q_object,則會生成另外乙個 c++ 原始檔。
這個原始檔中包含了 q_object 巨集的實現
**。這個新的檔案名字將會是原檔名前面加上 moc_ 構成。
這個新的檔案同樣將進入編譯系統,
最終被鏈結到二進位制**中去。
因此我們可以知道,這個新的檔案不是「替換」掉舊的檔案,而是與原檔案
一起參與編譯處理。
另外,我們還可以看出一點,moc的執行是在預處理器之前。因為預處理器執行之
後,q_object 巨集就不存在了。
qt的元物件系統是用來處理物件間通訊的訊號和槽,它執行資訊型別和動態屬性。
qt的元物件系統包括以下3個部分的內容:
(1)qobject類;
(2)類宣告私有段中的q_object巨集;
(3)元物件編譯器
qobject中的元物件**除了提供物件間通訊的訊號和槽以外,還可實現其他特徵。
(1)classname( )函式在執行時以字串返回類的名稱,不需要c++編譯器中的本地執行型別資訊的支援。
(2)inherits( )函式返回的物件是乙個繼承於qobject繼承樹中乙個特定類的例項。
(3)tr( )和trutf8( )兩個函式是用於國際化中的字串翻譯。
(4)setproperty( )和property( )兩個函式是用來通過名稱動態設定而獲得物件屬性。
使用qobject作為基類而不使用q_object巨集和元物件**是可以的,但是如果q_object巨集沒有被使用,
那麼這個類宣告的訊號和槽,以及其他特徵描述都不會被呼叫。
一般建議在qobject的所有子類中使用
q_object巨集,而不管它們是否使用了訊號與槽。
Qt元物件編譯器(moc)
qt的元物件系統是用來處理物件間通訊的訊號和槽,它執行資訊型別和動態屬性。qt的元物件系統包括以下3個部分的內容 1 qobject類 2 類宣告私有段中的q object巨集 3 元物件編譯器 元物件編譯器讀取c 原始檔時,如果發現在檔案中類的宣告中含有q object巨集,元物件編譯器就會給含有...
編譯方舟編譯器
環境 mac os parallels desktop 安裝ubuntu 16.04 安裝基礎包 sudo apt get y install openjdk 8 jdk git core gnupg flex bison gperf build essential zip curl zlib1g ...
方舟編譯器編譯
目錄環境變數 安裝 ninja 和 gn 編譯成功 總結2019.9.1 編譯華為方舟編譯器原始碼 這篇文章僅僅是關於如何搭建環境並進行編譯。本機環境 ubuntu 16 server.一定要好好看參考文件!建議使用root賬戶操作 先 clone 原始碼華為開源平台 對應的參考文件openarkc...