Visual Studio 2010源注释关键字导致名称冲突

时间:2012-02-29 11:22:01

标签: visual-studio-2010

将项目从Visual Studio 2005转换为Visual Studio 2010后,项目似乎不再构建,并且会出现大量C2059错误,如:

`错误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 : '}'

1 个答案:

答案 0 :(得分:2)

我找出了那些突然编译错误的原因。

windows.h的伟大传统中,微软似乎引入了令牌与我们的代码库发生冲突。

在我们的确切案例中,我们有: #define Null (void*)0

在我们的代码中,我们需要使用offsetof宏并使其可用#include <stddef.h>

我依次跟踪stddef.h包括crtdefs.h,其中包含sal.h,其中Null宏似乎与MS标头中的源代码注释发生冲突...... < / p>

作为解决方法,我们做了:

#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找到一种方法来避免与现有代码库的冲突。

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