error C2011: “tagSHAPE”:“enum”类型重定义
第一次写博客,心情激动,自己的水平怎样自己知道,也不指望能给大神们和伪大神们有什么帮助。仅仅作为一个计算机相关专业应届毕业生,为初学者指出弯路在哪里,以自己的教训和结果来帮助新人规避困难,成功解决一些看起来很难受的简单问题。
闲话少说,进入正题。
这次是我亲身遇到的一个问题,描述如:
在VC6.0下写的一个画图程序,仿Windows画图。没有用MFC的封装类,直接调用的WinAPI。由于某种需求,要将其移植到VS2010 的环境下。
而在移植过程中,出现了很多如“error C2011: “tagSHAPE”:“enum”类型重定义”的问题。在网上搜索结果,发现给的答案很多。其中一条比较主流的情况就是代码进行环境移植后的平台版本不兼容。而针对这种情况解决办法是“在VS中显式的定义Windows平台版本”。如:
#define _WIN32_WINNT 0x0500 //显式定义平台版本为Windows2000.
这个宏定义的含义为,本工程只有在Win2K以上的系统才能正常运行。
而其他系统版本定义,在sdkddkver.h中,定义系统版本类型:
//
// _WIN32_WINNT version constants
//
#define _WIN32_WINNT_NT4 0x0400
#define _WIN32_WINNT_WIN2K 0x0500
#define _WIN32_WINNT_WINXP 0x0501
#define _WIN32_WINNT_WS03 0x0502
#define _WIN32_WINNT_WIN6 0x0600
#define _WIN32_WINNT_VISTA 0x0600
#define _WIN32_WINNT_WS08 0x0600
#define _WIN32_WINNT_LONGHORN 0x0600
#define _WIN32_WINNT_WIN7 0x0601
这种解决方法,网上一搜遍地都有,烂大街的方法就此不在赘述。
可是,我这次遇到的问题“似乎不这么简单”。对平台版本进行设置,随后编译。问题照旧……难道我的机器如此特别?难道我的代码如此“创新”?!不能啊~~
没办法了,自己写代码添着玩。随手写进去一个先前写过的学生信息管理系统的枚举Student。再定义两个对象,自娱自乐一下放松下~编译,竟然student也有错误!以前的图形结构体出错,可能是系统版本问题,可这个student怎么可能和系统有关,完全自定义呢!而且绝不会发生系统冲突。那么问题肯定还是在这个工程甚至目前这个文件里。
重新审读代码,习惯性的浏览一遍头文件后,开始走代码。可就这一浏览,总觉得少点什么。少点什么……少了一次?少了一次!没有#pragma once!!!
试试看,头文件别处引用肯定不是一次,添加一句,试试看。
F7,ctrl+F5.没问题了。。。解决问题后,很无奈也很可笑。
这次的问题真的是很简单的一个问题,只是思维被限制在一个高度上,没有关注这个层面的问题。
而且,因为这次的工程是移植的,所以才会出现问题。在VC6中,头文件是通过宏定义来区分的,而宏定义中有如果已编译不再编译的字眼。但是VS是通过对工程公共头文件包含来区分的。并没有体现编译一次的定义。所以会出现变量重定义的情况。
总结,开发环境之间虽然大同小异但是一些细节的差异是不容忽视的。既然走上了编程开发这条路,除了满腔的热血,还要有十分的细致。每个细节做到最好,才能让可爱的机器如我所愿、如我所想。
自勉,学习必然是一个持久而不断进化的过程。但是不能因为学习了新东西而将思维方式限制,当遇到问题解决不了,不妨回到原点,从基础出发。相信很多问题 反而就会豁然开朗,柳暗花明了。流水无形,风动无踪,思维是没有定式的,不要将自己的思维停留在某一方面或某一层面。思维开阔了,加上严谨的逻辑,未来的路子才能越走越宽阔。
PS:第一次写博,更多的是给自己加油鼓劲,也希望能在这里能有长足的进步。技术不过关,我们可以学,大神都有过菜鸟的光辉岁月。我们怕的不是技术不过硬,怕的是心不靠谱,怕的,是没有一个让自己前进的目标而失去动力。
岂能尽如人意,但求问心无愧!
2014年7月24日于竹海。
http://www.cnblogs.com/suanec/
友链:marsggbo
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
点个关注吧~

浙公网安备 33010602011771号