2017-07-25 52 views
0

很抱歉的壞稱號之間的戰鬥,我會盡力來形容我的問題好一點..包括數據類型

我一個實時操作系統的工作。由於我有測試新功能的任務,而我們的主RTOS現在還不支持它,所以我將基於另一個(至今未使用的)RTOS製作原型。 這個新的實時操作系統帶來了自己的頭文件,其中包含許多類型定義以生成像ULONG,BOOL,INT等縮寫...

在我們的代碼庫中有typedefs,例如,可以保證unsigned long正好是4字節。根據我們的styleguide,這些新類型將用於我們生產的任何界面。
不幸的是,這些typedef的命名方式與新RTOS(ULONG,INT,BOOL,...)的命名方式相同。
構建破壞的事情是,BOOL例如曾經被聲明爲unsigned char並且一次被聲明爲int。
這會導致使用BOOL和其他不同類型的某些函數頭的損壞。

我的問題是,我怎樣才能使這兩個「主」頭之一,因此更喜歡它的typedefs其他頭文件?
還有什麼其他方式可以將這兩個標題分開?

因爲我只在新的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是相同的,不會造成麻煩。
該空隙限定碰撞在一些文件中的空隙的typedef和預處理器產生以下:

typedef void void; 

...產生一個編譯錯誤。
Bool typedef破壞了我的函數頭,因爲在一個文件中使用了RTOS版本,而在另一個文件中使用了我們代碼庫中的typedef。編譯器生成兩個不同的簽名,並且鏈接器無法找到其中一個的定義。 - >其他錯誤被拋出

+5

與其試圖用文字牆來描述您的代碼,向我們展示說明您的問題的代碼片段要容易得多。 – CoryKramer

+3

typedefs應該存在於單獨的命名空間內,如果這樣的話你不會遇到問題 – user463035818

+0

將你的基於代碼的typedef放到你的命名空間中。 –

回答

1

手動覆蓋的類型定義了一些預處理(AB)的使用是一個選項。

/* 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的含義。它的typedef BOOL將改爲typedef osBOOL,而BOOL的任何內部用途將替換爲osBOOL

重複您希望覆蓋已存在的操作系統定義的頭類型的任何其他原語縮寫的範例。

請注意,反過來也是可以的。如果您有一個包含在所有項目文件中的通用頭文件,則可以使用#defineBOOL,其中包含而不是,其中包含RTOS在包含其頭文件後保留的內容。然後,當您運行typedef BOOL char時,預處理器將首先將BOOL轉換爲myBOOL,以及在包括頭文件的代碼文件中使用它。

另請參閱this question瞭解一些相關的想法。

+0

謝謝你的回覆!我已經閱讀過這種方法,但認爲這有點破解,希望有其他方法。感謝您的鏈接! – simmue