簡體   English   中英

包括數據類型之間的斗爭

[英]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定義的標頭類型的任何其他原始縮寫重復該范例。

注意,也可以進行相反的操作。 如果您有包含在所有項目的文件一般的頭,你可以#defineBOOL存在的東西, 不是由RTOS包括它的頭后保留。 然后,當您運行typedef BOOL char ,預處理程序將首先將BOOL轉換為myBOOL ,以及將其在代碼文件中的所有用法(包括頭文件)都轉換為myBOOL

另請參閱此問題以獲取一些相關想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM