[英]Include fight between data types
對不起,標題不好,我會盡力描述我的問題。
我使用實時操作系統。 由於我有測試新功能的任務,而我們的主要RTOS尚不支持此功能,因此我將基於另一個(直到現在尚未使用)RTOS制作原型。 這個新的RTOS帶來了自己的頭文件,該頭文件包含許多typedef來生成縮寫,例如ULONG,BOOL,INT等。
在我們的代碼庫中,有typedef可以保證例如一個無符號的long恰好是4個字節。 根據我們的風格指南,這些新類型將用於我們生產的任何接口。
不幸的是,這些類型定義與新RTOS中的類型定義相同(ULONG,INT,BOOL等)。
令人頭疼的是,例如BOOL曾經被聲明為unsigned char,而一次被聲明為int。
這會導致使用BOOL和其他不同類型的某些函數頭損壞。
我的問題是,我怎樣才能使這兩個頭之一成為“主”頭文件,從而比其他頭文件更喜歡它的typedef?
您還可以通過什么其他方式划分這兩個標頭?
由於我僅在新的RTOS上實現了原型,因此更改基本類型被視為不太受歡迎的解決方案。 感謝您的幫助,如果您需要進一步的說明,請告訴我們!
編輯:
好的,這里有一些代碼需要進一步說明:
RTOS_typedefs.h
...
typedef void VOID;
typedef unsigned char BOOL;
typedef int INT;
...
ownCodeBase_typedefs.h
...
#define void VOID
typedef int BOOL;
typedef int INT;
現在您可以看到,INT typedef相同,不會造成任何麻煩。
在某些文件中,Void定義與void typedef沖突,並且預處理器產生以下內容:
typedef void void;
...會產生編譯器錯誤。
Bool typedef破壞了我的函數頭,因為在一個文件中使用了RTOS版本,在另一個文件中使用了我們代碼庫中的typedef。 編譯器生成兩個不同的簽名,鏈接器找不到其中一個的定義。 ->引發另一個錯誤
可以選擇使用一些預處理器(ab) 手動覆蓋 typedef。
/* Rename the OS version of 'BOOL' to something else */
#define BOOL osBOOL
#include <osheader>
#undef BOOL
/* When myheader.h is included, BOOL is still free to be typedef'd'. */
#include myheader.h
手動覆蓋將防止RTOS覆蓋應用程序中BOOL的含義。 它BOOL的類型定義將代替的typedef osBOOL
和任何內部使用BOOL
都被替換為osBOOL
。
對希望覆蓋其已存在的OS定義的標頭類型的任何其他原始縮寫重復該范例。
注意,也可以進行相反的操作。 如果您有包含在所有項目的文件一般的頭,你可以#define
宏BOOL
存在的東西, 不是由RTOS包括它的頭后保留。 然后,當您運行typedef BOOL char
,預處理程序將首先將BOOL
轉換為myBOOL
,以及將其在代碼文件中的所有用法(包括頭文件)都轉換為myBOOL
。
另請參閱此問題以獲取一些相關想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.