加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:10:19 所属栏目:百科 来源:网络整理
导读:在将项目从Visual Studio 2005移植到2013时,我遇到了这种奇怪的行为,我无法找到解释.上下文是关于通过多次包含某个头文件来创建模板特化,但是在每个包含之前更改预处理器定义以基本上生成不同的类声明. 我可以将问题缩小到以下情况: gen.hpp #ifdef ENABLE_
在将项目从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;
}

这按预期工作,即Foo和Bar都在main()中声明和使用.

现在,为了解决问题,将标记为(1)的行中的#ifdef更改为#ifndef,这实际上只会导致声明Foo和Bar被声明的顺序被交换.但相反,编译失败了:

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

预处理文件看起来像这样(剥离了一些空格):

#line 1 "c:pathtomain.cpp"

#line 1 "c:pathtogen.hpp"

   class Foo {};

#line 8 "c:pathtogen.hpp"

#line 10 "c:pathtogen.hpp"
#line 4 "c:pathtomain.cpp"

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

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

谢谢!

解决方法

根据dyp的评论,这是 MS Connect issue 800200,并在VS2013 RTM中修复.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读