2012-02-29 95 views
1

從Visual Studio 2005已經轉換項目到Visual Studio 2010年之後,出現的項目並沒有編譯和吐出噸C2059的錯誤,如:Visual Studio 2010中源註釋關鍵字引起名稱衝突

'錯誤C2059:語法錯誤:'type'

我們使用的是不提供靜態代碼分析的Visual Studio 2010 Professional。

以下是完整的日誌1個C文件彙編以供參考:

1>------ Build started: Project: VoHR, Configuration: Debug Win32 ------ 
1> AKAsynch.c 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(88): error C2059: syntax error : 'type' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(107): error C2059: syntax error : '}' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(119): error C2059: syntax error : 'type' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(139): error C2059: syntax error : '}' 

回答

2

我就找到了那些突然編譯器錯誤的原因。

windows.h的偉大傳統中,似乎微軟引入了令我們的代碼庫發生名稱衝突的令牌。

在我們精確的情況下,我們有: 在我們的代碼#define Null (void*)0

某處,我們需要使用offsetof宏並使其可我們#include <stddef.h>

我找到了stddef.h輪流包括crtdefs.h這包括sal.h,其中我們的Null宏似乎與MS頭中的源代碼註釋衝突...

作爲解決方法,我們做了:

#if defined(_MSC_VER) && _MSC_VER >= 1600 
#pragma push_macro("Null") 
#undef Null 
#endif 
#include <stddef.h> 
#if defined(_MSC_VER) && _MSC_VER >= 1600 
#pragma pop_macro("Null") 
#endif 

我們使用的Null宏是值得商榷的,還是我本來期望MS找到一種方法,以避免與現有的代碼庫發生衝突。

希望能幫助那些面臨同樣問題的人。