VS2013-多个包含相同标头的错误

托本·L。

在将项目从Visual Studio 2005移植到2013时,我遇到了这种奇怪的行为,无法找到解释。上下文是关于通过多次包含一个特定的头文件来创建模板专业化,但是要在每个包含之前更改预处理器定义,以基本上生成不同的类声明。

我可以将问题缩小到以下情况:

gen.hpp

#ifdef ENABLE_GEN

#ifdef GEN_SWAP_ORDER // (1)
   class Foo {};
#else
   class Bar {};
#endif

#endif

main.cpp

#define ENABLE_GEN

#include "gen.hpp"
#define GEN_SWAP_ORDER
#include "gen.hpp"

int main()
{
   Foo foo;
   Bar bar;
}

这可以按预期工作,即FooBar都可以在中声明和使用main()

现在,要引起此问题,请将#ifdef(1)标记的行更改#ifndef,这应该只有效地导致FooBar声明被交换的顺序但是相反,编译然后失败了:

1>c:\path\to\main.cpp(10): error C2065: 'Bar' : undeclared identifier
1>c:\path\to\main.cpp(10): error C2146: syntax error : missing ';' before identifier 'bar'
1>c:\path\to\main.cpp(10): error C2065: 'bar' : undeclared identifier

预处理后的文件如下所示(去除了空白):

#line 1 "c:\\path\\to\\main.cpp"

#line 1 "c:\\path\\to\\gen.hpp"

   class Foo {};

#line 8 "c:\\path\\to\\gen.hpp"

#line 10 "c:\\path\\to\\gen.hpp"
#line 4 "c:\\path\\to\\main.cpp"

int main()
{
   Foo foo;
   Bar bar;
}

我的问题是:我想念什么吗?这是出于某种原因的预期行为吗?它是一个编译器设置/错误,当Visual Studio#else认为它具有标题保护功能时(由于#ifndef,使Visual Studio第二次跳过标题内容(包括该部分)?

谢谢!

索德

根据dyp的评论,这是MS Connect问题800200,已在VS2013 RTM中修复。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Clang + VS2013:包含C ++标头时发生错误(vs2012:working)

VS2013或VS2015显示“未指定的错误”

VS2013 Typescript:引用和调试多个项目

为什么VS2013中的#warning会产生错误?

剃刀视图中的Mvc5 VS2013错误

如何修复vs2013的C3848错误?

未解决的外部符号错误(VS2013 Express)

错误SIPEPS,版本= 5.0.0.0 UCMA 4.0 VS2010 / VS2013

LINQ设计时间错误从VS2010升级到VS2013

vcxproj 从 vs2013 更新到 vs2015 后的 ICE(内部编译器错误)

包含TypeScript的解决方案始终使用VS2013进行永久加载

VS2013:当正则表达式包含\时,STL regex类崩溃

外部VS2013构建错误“错误MSB4019:找不到导入的项目<路径>”

VS2013:错误加载解决方案('JavascriptWebExtensionsPackage无法正确加载')

为什么C ++编译器(VS2013)选择错误的函数?

奇怪的VS2013错误?还是程序员诱发疾病?

内联成员缺少返回时没有错误(VS2013)

VS2013 VC ++ libcurl LNK2028 LNK2019链接错误

全局asa错误处理在vs2013中不再起作用了吗?

VS2013 Cordova空白应用程序命令失败,出现退出代码8错误

VS2013错误:LNK2019尝试构建ZeroMQ服务器时

我不明白VS2013编译器显示的错误

如何在C ++中使用libcurl调试SSL连接错误(vs2013)

VS2013 MVC 5模板:使用会话将声明从ExternalLoginCallback保存到ExternalLoginConfirmation是否错误

在VS2013中编译rdlc-错误本机编译器返回值:'-1073741511'

CMake:当项目包含带有VS2013的.asm MASM源代码时,如何避免链接错误?

VS2013是否使用与VS2012相同的C运行时(例如,msvcr110)?

C ++模板:VS2017中出现C2143错误,但在VS2013中编译

VS2013调试器无法再解析包含源代码路径的系统环境变量