我有一些遺留代碼已經進行了條件預處理,例如, #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字符識別。
任何幫助表示讚賞! 謝謝。
注意'__attribute__'不是宏。在Windows上編譯時,只要確保'#define _WINDOWS 1'。 –
@MarcGlisse謝謝......這正是我所希望的。我使用的是Visual Studio 2010,如果按CTRL +,則可以看到所有預定義的函數屬性和宏 - _WINDOWS不存在。我會在屬性表或我的主方法運行器文件中執行此操作。 –
ha9u63ar
您可能希望'#ifndef _MSC_VER'而不是'#ifndef _WINDOWS'。當包含''時,存在一個名爲'_WINDOWS_'的定義(但注意附加的尾部下劃線),但通常區分GCC/MSVC的方法是通過'GCC'和'_MSC_VER'定義的。 –
Groo