2017-01-04 31 views
-1

我正在研究在Linux中運行超過20年的遺留代碼。 它有3個模塊,由3個不同的人來處理。我只能在一個模塊中進行更改。Windows MSG結構與舊版項目代碼衝突struct MSG

現在我得到了一個任務,在windows中以最小的功能構建相同的代碼。

對於進程間通信,使用消息結構。它與Windows MSG結構相沖突。

該結構也在其他兩個模塊中使用。

我不想重命名結構。 有沒有其他解決方法?代碼是C和C++的組合。

+1

將它與命名空間一起使用。 –

+0

MSG結構也在C文件中使用。 C沒有名稱空間。 – atulya

+0

包裝函數和/或包裝宏。 – user3386109

回答

2

不是。 One Definition Rule指出每個名稱都應該有一個唯一的定義,並且您現有的::MSG的定義與::MSG的定義<Windows.h>不匹配。

Windows編譯器不傾向於強制執行ODR,因此您可能會忽略它。你通常會通過兩種類型之間的硬性分離來做到這一點。也就是說,在包含windows.h的.cpp文件中,不能包含任何項目標題,反之亦然。兩個部分之間的接口必須在它自己的頭文件中定義,它不依賴於windows.h或自己的頭文件。 (作爲一個好處,您可以提供Linux的該.cpp文件的替代實現,這意味着您的代碼不會被散佈在#ifdef WIN32

+0

第一時間,我想通過項目範圍的命令行編譯器選項添加諸如'#define MSG _myMSG'之類的東西。''-DMSG = myMSG'或者我認爲非常接近的東西。但是,它也會在'windows.h'中觸發,除非這個選項只被添加到與窗口無關的代碼中,這就意味着需要像你寫的那樣分離代碼。所以..大拇指首先代碼分離! – quetzalcoatl

+0

@quetzalcoatl:你當然可以用'#define MSG_before MSG'和'#define MSG MSG_before #undef MSG_before'圍繞'#include windows.h'。但這意味着你不能調用相關的窗口函數。 – MSalters

+0

謝謝@MSalters,會試一試。 – atulya

相關問題