网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > DotNet > VC.NET > VC预处理指令与宏定义的妙用  

VC预处理指令与宏定义的妙用

2006-09-08  作者:网管整理  来源:bitscn  点评 投稿 收藏

    刚接触到MFC编程的人往往会被MFC 向导生成的各种宏定义和预处理指令所吓倒,但是预处理和宏定义又是C语言的一个强大工具。使用它们可以进行简单的源代码控制,版本控制,预警或者完成一些特殊的功能。

网管u家u.bitsCN.com

    一个经典的例子

网管u家u.bitscn@com

    使用预处理与宏定义最经典的例子莫过于加在一个头文件中以避免头文件被两次编译。试想这种的情况,有一个文件headerfile.h 它被包含在headerfile1.h中,同时在headerfile2.h 中也被包含了,现在有一个CPP文件,implement.cpp 包含了headerfile1.h 和headerfile2.h:

网管论坛bbs_bitsCN_com

    #include “headerfile1.h”

网管u家u.bitsCN.com

    #include “headerfile2.h”

网管网www.bitscn.com

    假设headerfile.h 中定义了一个全局变量 iglobal . 网管联盟bitsCN_com

    int iglobal; 中国网管联盟bitsCN.com

    在编译的时候编译器两次编译headerfile,也就会发现iglobal被定义了两次,这时就会发生变量重定义的编译错误。 网管网www.bitscn.com

    传统的解决办法是使用#ifdef 以及#endif 来避免头文件的重复编译,在上面的例子中,只需要加上这么几行:

网管有家www.bitscn.net

    #ifndef smartnose_2002_6_21_headerfile_h

网管u家u.bitsCN.com

    #define smartnose_2002_6_21_headerfile_h 网管u家u.bitscn@com

    int iglobal;

网管bitscn_com

    #endif 网管联盟bitsCN_com

    仔细的考虑上面的宏定义,会发现当编译器编译过一次headerfile.h以后,smartnose_2002_6_21_headerfile_h 这个宏就被定义了,以后对headerfile.h的编译都会跳过int iglobal 这一行。当然smartnose_2002_6_21_headerfile_h 这个宏是可以任意定义的,但是这个宏本身不能和其它文件中定义的宏重复,所以MFC在自动生成的文件中总是使用一个随机产生的长度非常长的宏,但我觉得这没有必要,我建议在这个宏中加入一些有意义的信息,比方作者,文件名,文件创建时间等等,因为我们有时候会忘记在注释中加入这些信息。

网管u家u.bitscn@com

    在VC.Net 中我们不会再看见这些宏定义了,因为在这里会普遍使用一个预处理指令:

网管网www_bitscn_com

    #pragma once

网管u家u.bitsCN.com

    只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。 中国网管论坛bbs.bitsCN.com

    源代码版本控制 网管联盟bitsCN_com

    当我们为许多平台开发多个版本的时候预编译指令和宏定义也能够帮我们的忙。假设我们现在为WINDOWS 和LINUX开发了一套软件,由于这两种系统的不同,我们不得不在程序控制源代码的版本。比方内存的分配,我们可以在LINUX上使用标准C的malloc 函数,但是我们希望在 WINDOWS上使用HeapAlloc API.下面的代码演示了这种情况:

网管有家www.bitscn.net

    main() 网管bitscn_com

    {

网管u家www.bitscn.net

    …………………… 网管联盟bitsCN@com

    #ifdef _WINDOWS_PLATFORM

中国网管联盟bitsCN.com

    HeapAlloc(5);

网管朋友网www_bitscn_net

    #else

网管u家bitscn.net

    malloc(5); 网管联盟bitsCN_com

    #endif 中国网管联盟bitsCN.com

    …………………… 中国网管论坛bbs.bitsCN.com

    } 网管网www_bitscn_com

    当我们在WINDOWS 平台上编译此程序的时候,只需要定义_WINDOWS_PLATFORM这个宏,那么HeapAlloc这条语句就能够起作用了。这样就能够让我们在同一个文件中为不同的平台实现不同版本的代码,同时保持程序的良好结构。在许多情况下,我们还可以为一个方法使用不同的算法,然后用宏定义来针对不同的情况选择其中的一个进行编译。这在MFC应用程序中是使用得最多的。最明显的就是文件中经常存在的

网管朋友网www_bitscn_net

    #ifdef _DEBUG 网管u家u.bitscn@com

    ……………………。some code…………… 网管下载dl.bitscn.com

    #endif

网管朋友网www_bitscn_net

    这样的代码,这些代码在应用程序的调试版(DEBUG)中会发挥其作用。 网管论坛bbs_bitsCN_com

    #Pragma 指令 中国网管论坛bbs.bitsCN.com

TAGs定义   指令   处理   编译    
 上一篇:深入探讨.NET中的钩子技术   下一篇:VC++.NET几个比较难缠的问题及其解决方法
VC预处理指令与宏定义的妙用 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: