- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
浅谈vc工程项目
浅谈VC++工程的文件组织
这篇文章题目叫“浅谈 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 !
另外,个人认为,我们似乎没有什么理由创建自己
文档评论(0)