C++工程文件组织.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
这篇文章题目叫“浅谈VC++工程的文件组织”,其实内容不光是文件组织了,内容还还很广,我很早就想写这么篇文章,一方面是总结这几年下来的经验,另一方面就是能和别人交流交流,为了不让读者在阅读中丧失兴趣,我将在文章中加入大量生动的例子,所以这篇文章内容很散,但知识本身就是一种离散的积累之后才形成关系的连贯,难道不是吗?此文的观点并不“权威”,只是我个人的观点,欢迎来信和留言,图共同进步。 1、全局变量的声明与定义 一般来说,.h文件是存放定义(Definition)的地方,而.cpp文件这是存放实现的地方(Implementation)。 简单说是这样的,不过问题来了,如果你需要一个全局变量: HWND g_hwndMain; 那么应该放在.h文件中,还是在.cpp文件中?对单个变量来说,这既是声明也是定义也是实现。按照我做法,把它放到.cpp文件中,比如放到main.cpp中去。至于.h里,根本不需要提及它。那如果需要在别的文件中使用到这个全局变量,那应该怎么办?那就声明一下吧: extern HWND g_hwndMain; 加上了extern前缀,就变成了声明,而不是定义。如果工程中有声明g_hwndMain,但不存在“HWND g_hwndMain”这个定义的话,在link的时候就会出错。 这里顺便提一下面试时候经常问到的一个问题,在全局变量前面加上关键字static,起到什么作用?这个问题不懂就是不懂,想不出来的。其实很简单,就是让这个全局变量只能在这个模块(文件)中使用。为什么?因为static,extern两者不同同时修饰一个变量,尝试“extern static HWND g_hwndMain”,这样会导致编译错误。 “extern HWND g_hwndMain”作为一个声明,是不是就一定把它放在.h文件中,不是,应该在哪里需要使用到g_hwndMain,就在哪里声明。 大家想到了,其实使用全局变量会降低程序可读性,但开发中全局变量确实又能提供很多便利,因此用不着盲目排斥它。 2、包含关系 习惯上来说把一个类写在一个.h和一个.cpp文件中,这样维护起来比较简单,比如我要写一个类叫CRS232Comm,一个串口通信类,那么我就创建两个文件RS232Comm.h和RS232Comm.cpp,一个是class CRS232Comm这个类的定义,一个实现。RS232Comm.cpp中有“#include RS232Comm.h”。 一般来说,总是.cpp包含.h,那有没有包含.cpp的时候呢?你见过吗?我不知道你见没见过,但我确实见过J。那就是在使用IDL(接口描述语言,写过COM都应该知道)的时候,MIDL(IDL的编译器)会把IDL变成四个文件,其中有一个为“xxxx_i.c”,对就是它,你得include它,于是就出现了比较尴尬的“#include xxxx_i.c”。为什么生成的是“xxxx_i.c”而不是“xxxx_i.h”呢?我也不知道,如果你知道,你可以告诉我。 但除了IDL这种情况,我们还是没有什么理由需要包含.c或者.cpp。 那除了.h和上面这个特殊的情况,我们还能包含些什么?也许你马上想到了,比如: #include iostream 哈,这个文件既不是.c也不是.h,那我们能不能不用它,改用iostream.h?一般来说只是为了使用cout这种对象是可以的。但意义上有差别,iostream和iostream.h是不一样的,一个是模板库,一个是C++库头文件。这里顺便提起一下以前的一件事,我刚进入上上家公司的时候,头要我们写个类模板,于是我就跟写一般的类一样把它分为两个文件,一个.h,一个.cpp,一个放定义,一个放实现。你们认为我的做法有问题么?写过模板的人都应该知道,这样是不行的,因为C++中的实现是针对类的实现,而不是针对模板的实现,分开写会导致连接时候找不到实现的。因此必须将模板的“定义”与“实现”写在同一个文件中,那这个文件究竟叫“.h”好呢还是“.cpp”好呢?都不好,它既不是类的定义也不是类的实现,它是模板,模板就是模板,那干脆就不用文件扩展名,STL就怎么干的,That’s OK! 另外,个人认为,我们似乎没有什么理由创建自己的模板库了,模板的90%的用途在于“容器”,而这一切STL都做好了,自己写个模板出来容易令人费解,况且真的有必要吗?我确实没想出太多的理由。最近我甚至对STL有些排斥态度,我在一个类中用到了STL的vector,程序在_DBCS选项下编译运行没有任何问题,但如果用_UNICODE选项编译,在程序关闭时候就会出现运行时错误,这个错误发生在“}”之后,无影无踪,令我不知所措,把vector拿掉之后就没看到这个错误,我没看出我的代码有什么问题,而只要不用_UNICO

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档