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中修复.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |