元物件編譯器moc

2021-06-25 14:26:43 字數 1195 閱讀 6082

諸位周知,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...