class类型重定义.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
class类型重定义

class类型重定义:C++中的类型重定义 疯狂代码 http://www.CrazyC/ ĵ http:/www.CrazyC/VC/Article13218.html 这几天工作时碰到一个C++的编译错误(我使用的是VisualC++7.0),说是有一个类重复定义,仔细想想 我们的这个项目也是做了好几个Release了,内部代码应该不会有这样的低级错误,真把类型给重复定义了,检 查结果正如我预料的一样。就这样,我左右没找到原因,被一个编译错误给卡在那里了。(在我的概念中,程 序错误的等级为:编译错误-链接错误-逻辑错误,此错误属于最低级)。这时我仔细看了一下错误提示 ,发现重复定义是由于从两个不同的路径包含了同一个头文件而引起的,同事也建议从另外一个路径打开工程 试试,这才慢慢发现了原因。这个原因可能有些拗口,而事实上要出现这种错误也有些“曲折“,让我从不同 情况下的类型重定义来解释一下吧。 我总结的C++中类型重定义情况有三。 1没有在文件头加#pragmaonce指示符。 Type1.h:#pragmaonce的作用是保证本文件只被编译一次,如果没有在Type1.h中加这句话,那么在 main.cpp里面包含了两次Type1.h,就相当于在main.cpp里面定义了两次Type类,自然就是类型重定义了。 //#pragmaonce classType { }; Main.cpp: #include\Type1.h\ #include\Type1.h\ intmain(intargc,char*argv[]) { return1; } 2两个不同的头文件中定义了相同的类型(均有#pragmaonce) Type1.h:Type2.h:Main.cpp: #pragmaonce classType { }; #pragmaonce classType { }; 这里main.cpp中同时包含了Type1.h,Type2.h两个头文件,虽然其文件头都有#pragmaonce,但因为是不同 的文件,预编译器还是会两次把Type类的定义放在Main.cpp中,所以也会出现了重定义。 #include\Type1.h\ #include\Type2.h\ intmain(intargc,char*argv[]) { return1; } 3从两个不同的路径包含了同一个头文件 前面两种是比较常见,也是比较容易解决的情况,而这里要讲的第三种情况,比较少见,而且一般出现在有虚 拟映射盘的时候。(这样才能做到从两个不同的路径包含同一个头文件),其他会在什么时候出现,我还没想 到,知道的朋友顶一下:)。下面我来分析一下: 1)有VC工程在D:\\Test目录下。 2)映射虚拟盘X为D:\\Test. 不熟悉的网友可以按此操作:开始-运行-在运行窗口输入:cmd-在cmd窗口输入: SubstX:D:\\Test-回车。 3)该工程有文件Type1.h,main.cpp Type1.h: #pragmaonce classType { }; Main.cpp: main.cpp这样包含了两个头文件,从本质上来讲,它们都对应于物理盘D:\\Test下的文件Type1.h,是同一个文 件。但在不同的操作下,VC对其有不同的解释。#include\X:\\Type1.h\用的是绝对路径,自然没有什么异议 ,但#include\Type1.h\却有些变化: *假如我从D:\\Test\\下打开工程,那么#include\Type1.h\其实就是#include\D:\\Test\\Type1.h\ *假如从X:\\下打开工程,那么#include\Type1.h\就解释为#include\X:\\Type1.h\ #include\Type1.h\ #include\X:Type1.h\ intmain(intargc,char*argv[]) { return1; } 这里我们在 4)在D:\\Test下打开工程,编译,出现类型Type重复定义错误 这种情况下,main.cpp预编译为: Main.cpp: 只保证本文件被编译

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档