- 1
- 0
- 约6.11千字
- 约 10页
- 2016-12-03 发布于贵州
- 举报
VC预处理令和宏定义
刚接触到MFC编程的人往往会被MFC 向导生成的各种宏定义和预处理指令所吓倒,但是预处理和宏定义又是C语言的一个强大工具。使用它们可以进行简单的源代码控制,版本控制,预警或者完成一些特殊的功能。 一个经典的例子 使用预处理与宏定义最经典的例子莫过于加在一个头文件中以避免头文件被两次编译。试想这种的情况,有一个文件headerfile.h 它被包含在headerfile1.h中,同时在headerfile2.h 中也被包含了,现在有一个CPP文件,implement.cpp 包含了headerfile1.h 和headerfile2.h:
#include “headerfile1.h”#include “headerfile2.h” 假设headerfile.h 中定义了一个全局变量 iglobal 。
int iglobal; 在编译的时候编译器两次编译headerfile,也就会发现iglobal被定义了两次,这时就会发生变量重定义的编译错误。 传统的解决办法是使用#ifdef 以及#endif 来避免头文件的重复编译,在上面的例子中,只需要加上这么几行:
#ifndef smartnose_2002_6_21_headerfile_h#define smartnose_2002_6_21_headerfile_hint iglobal;#endif 仔细的考虑上面的宏定义,会发现当编译器编译过一次headerfile.h以后,smartnose_2002_6_21_headerfile_h 这个宏就被定义了,以后对headerfile.h的编译都会跳过int iglobal 这一行。当然smartnose_2002_6_21_headerfile_h 这个宏是可以任意定义的,但是这个宏本身不能和其它文件中定义的宏重复,所以MFC在自动生成的文件中总是使用一个随机产生的长度非常长的宏,但我觉得这没有必要,我建议在这个宏中加入一些有意义的信息,比方作者,文件名,文件创建时间等等,因为我们有时候会忘记在注释中加入这些信息。 在VC.net 中我们不会再看见这些宏定义了,因为在这里会普遍使用一个预处理指令:
#pragma once 只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。 源代码版本控制 当我们为许多平台开发多个版本的时候预编译指令和宏定义也能够帮我们的忙。假设我们现在为Windows 和Linux开发了一套软件,由于这两种系统的不同,我们不得不在程序控制源代码的版本。比方内存的分配,我们可以在LINUX上使用标准C的malloc 函数,但是我们希望在 Windows上使用HeapAlloc API。下面的代码演示了这种情况:
main(){………………..#ifdef _WINDOWS_PLATFORMHeapAlloc(5);#elsemalloc(5);#endif………………..} 当我们在WINDOWS 平台上编译此程序的时候,只需要定义_WINDOWS_PLATFORM这个宏,那么HeapAlloc这条语句就能够起作用了。这样就能够让我们在同一个文件中为不同的平台实现不同版本的代码,同时保持程序的良好结构。在许多情况下,我们还可以为一个方法使用不同的算法,然后用宏定义来针对不同的情况选择其中的一个进行编译。这在MFC应用程序中是使用得最多的。最明显的就是文件中经常存在的
#ifdef _DEBUG…………………….some code………..#endif 这样的代码,这些代码在应用程序的调试版(DEBUG)中会发挥其作用。 #Pragma 指令 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。其格式一般为 #Pragma Para 其中Para 为参数,下面来看一些常用的参数。 message 参数。 Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:#Pragma message(“消息文本”) 当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。 当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法
#ifdef _X86
您可能关注的文档
- SKF润滑性能及用途.doc
- SKG130原汁机评测:锁定营养,多倍出汁.doc
- SKG135原汁机:无氧化出汁口,果汁营养高.doc
- SKG206原汁机评测(new).doc
- SLB立式拆式双吸泵价格.doc
- SMA-1面层试铺总结.doc
- SKG209原汁机评测 (6-26).doc
- SMI第八拆分为什么拆分1.6倍 这是为什么呢,亲爱的玩家们仔细瞧瞧.doc
- SMAR通型彩色视频会议摄像机.技术规格.特性。..doc
- SMP-Q-016-A 产品放行管理制度.doc
- 广东省广州省实验中学教育集团2025-2026学年八年级上学期期中考试物理试题(解析版).docx
- 广东省广州大学附属中学2025-2026学年八年级上学期奥班期中物理试题(解析版).docx
- 广东省广州市第八十六中学2025-2026学年八年级上学期期中物理试题(含答案).docx
- 广东省广州市第八十九中学2025-2026学年八年级上学期期中考试物理试题(解析版).docx
- 广东省广州市第二中学2025-2026学年八年级上学期期中考试物理试题(含答案).docx
- 广东省广州市第八十六中学2025-2026学年八年级上学期期中物理试题(解析版).docx
- 广东省广州市第八十九中学2025-2026学年八年级上学期期中考试物理试题(含答案).docx
- 广东省广州市第二中学2025-2026学年八年级上学期期中考试物理试题(解析版).docx
- 2026《中国人寿上海分公司营销员培训体系优化研究》18000字.docx
- 《生物探究性实验教学》中小学教师资格模拟试题.docx
最近下载
- 玉石之分——古代玉石艺术.ppt VIP
- 冷库、保鲜库设备采购投标方案 第七章 冷库、保鲜库设备安装、调试及培训方案.docx VIP
- 国土空间规划学-全套PPT课件.pptx
- 《纤维艺术设计与制作》教学课件—01纤维艺术概述.ppt VIP
- 山东铝业考试题库及答案.doc VIP
- 部编版小学语文五年级下册教材分析与教学建议(课件).pptx VIP
- 电力系统规划:配电系统规划_(7).配电系统优化设计.docx
- 山东铝业考试题库及答案2025.docx VIP
- 黑龙江省齐齐哈尔市2025届高考一模地理试卷(含答案).pdf VIP
- 宁夏回族自治区吴忠市同心县2021-2022学年八年级下学期期末考试数学试卷(word版含答案).docx VIP
原创力文档

文档评论(0)