2013-10-08 106 views
4

我有一些遺留代碼已經進行了條件預處理,例如, #ifdef#else我在那裏發現了使用宏的__attribute__。我做了一個快速的研究,發現它特定於GNU編譯器。我必須在使用MSVC10編譯器的Visual Studio 2010中使用此遺留代碼,並且顯然它在抱怨屬性((未使用))的任何地方,即使它受#ifndef#ifdef的保護。一個例子是:__attribute __()宏及其對基於Visual Studio 2010的項目的影響

#ifdef __tone_z__ 
    static const char *mcr_inf 
#else 
    static char *mcr_inf 
#endif 
#ifndef _WINDOWS 
__attribute__((unused)) % this is causing all the problem!! 
#endif 
= "@(#) bla bla copyright bla"; 



#ifdef __tone_z__ 
    static const char *mcr_info_2a353_id[2] 
#else 
    static  char *mcr_info_2a353_id[2] 
#endif 
__attribute__((unused)) = { "my long copyright info!" } ; 

我真的很難理解,如果它是非常糟糕的計劃代碼或者它只是我的誤解。我如何避免這個__attribute__()指令通常的編譯器和鏈接器錯誤?我已經開始得到C2061錯誤(缺少標識符/未知)。我已經得到了所有必要的頭文件,沒有遺漏任何東西,除了GNU編譯器(我不想要!)。

此外,看起來行代碼;的末尾也被搞砸了,當我在窗口代碼...... argh ....我的意思是UNIX行尾和Windows EOL如何可以我使用此代碼而不修改主體....我可以在我的屬性表中定義_WINDOWS thingy,但不能自動調整EOL字符識別。

任何幫助表示讚賞! 謝謝。

+1

注意'__attribute__'不是宏。在Windows上編譯時,只要確保'#define _WINDOWS 1'。 –

+0

@MarcGlisse謝謝......這正是我所希望的。我使用的是Visual Studio 2010,如果按CTRL + ,則可以看到所有預定義的函數屬性和宏 - _WINDOWS不存在。我會在屬性表或我的主方法運行器文件中執行此操作。 – ha9u63ar

+0

您可能希望'#ifndef _MSC_VER'而不是'#ifndef _WINDOWS'。當包含''時,存在一個名爲'_WINDOWS_'的定義(但注意附加的尾部下劃線),但通常區分GCC/MSVC的方法是通過'GCC'和'_MSC_VER'定義的。 – Groo

回答

14

我最好的猜測是,_WINDOWS,其實,你的編譯器定義的,因此使用的是__attibute__保護

在我看來,以防止屬性最好的辦法就是像這樣定義一個宏:

#define __attribute__(A) /* do nothing */ 

這應該簡單地從代碼中刪除所有__attribute__實例。

事實上,這已經被寫入可移植的大多數代碼有這樣的:

#ifdef _GNUC 
    #define ATTR_UNUSED __attribute__((unused)) 
#else 
    #define ATTR_UNUSED 
#endif 

static TONE_Z_CONST char *integ_func ATTR_UNUSED = "my copyright info"; 

(其它__tone_z__條件爲清楚起見,僅去除。)

+0

它沒有工作!我做了足夠的谷歌研究,似乎沒有任何東西可以解決這個問題。我需要的只是使用爲GNU C編譯器編寫的遺留代碼,並將其放在Visual Studio 2010上。我還更新了代碼段! – ha9u63ar

+2

MicroSoft編譯器不會接受任何'__attribute__'關鍵字或任何其他GNU擴展;甚至一些標準的C/C++也值得懷疑。您將不得不手動或通過預處理器刪除所有這些內容。我已經向你展示了一些方法。這真的不那麼難。 – ams

相關問題