2012-02-29 74 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找到一种方法,以避免与现有的代码库发生冲突。

希望能帮助那些面临同样问题的人。