宏定义#ifndef和#define,#endif的使用分析
2008-05-04 22:09
435 查看
一个经典的例子
使用预处理与宏定义最经典的例子莫过于加在一个头文件中以避免头文件被两次编译。试想这种的情况,有一个文件headerfile.h 它被包含在headerfile1.h中,同时在headerfile2.h 中也被包含了,现在有一个CPP文件,implement.cpp 包含了headerfile1.h 和headerfile2.h:
假设headerfile.h 中定义了一个全局变量 iglobal 。
在编译的时候编译器两次编译headerfile,也就会发现iglobal被定义了两次,这时就会发生变量重定义的编译错误。
传统的解决办法是使用#ifdef 以及#endif 来避免头文件的重复编译,在上面的例子中,只需要加上这么几行:
仔细的考虑上面的宏定义,会发现当编译器编译过一次headerfile.h以后,smartnose_2002_6_21_headerfile_h 这个宏就被定义了,以后对headerfile.h的编译都会跳过int iglobal 这一行。当然smartnose_2002_6_21_headerfile_h 这个宏是可以任意定义的,但是这个宏本身不能和其它文件中定义的宏重复,所以MFC在自动生成的文件中总是使用一个随机产生的长度非常长的宏,但我觉得这没有必要,我建议在这个宏中加入一些有意义的信息,比方作者,文件名,文件创建时间等等,因为我们有时候会忘记在注释中加入这些信息。
在VC.Net 中我们不会再看见这些宏定义了,因为在这里会普遍使用一个预处理指令:
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。
使用预处理与宏定义最经典的例子莫过于加在一个头文件中以避免头文件被两次编译。试想这种的情况,有一个文件headerfile.h 它被包含在headerfile1.h中,同时在headerfile2.h 中也被包含了,现在有一个CPP文件,implement.cpp 包含了headerfile1.h 和headerfile2.h:
#include “headerfile1.h” #include “headerfile2.h” |
int iglobal; |
传统的解决办法是使用#ifdef 以及#endif 来避免头文件的重复编译,在上面的例子中,只需要加上这么几行:
#ifndef smartnose_2002_6_21_headerfile_h #define smartnose_2002_6_21_headerfile_h int iglobal; #endif |
在VC.Net 中我们不会再看见这些宏定义了,因为在这里会普遍使用一个预处理指令:
#pragma once |
相关文章推荐
- ifndef,#define,#endif的使用方法
- #ifdef、#ifndef、#define与#endif的使用
- 关于#define 、#if、#endif、#else的使用
- 头文件使用#ifndef#define #endif的好处及原因
- #ifdef,#endif ,#ifndef,#define,#endif的使用与效果
- #ifndef,#define,#endif使用
- php session阻塞页面分析及优化 (session_write_close session_commit使用)
- 静态分析工具PMD使用说明
- 在数据结构使用 xml或json上的选择分析
- Android系统Recovery工作原理之使用update.zip升级过程分析(三)---Android系统的三种启动模式
- 转:智能模糊测试工具 Winafl 的使用与分析
- Android中Preference的使用以及监听事件分析
- 使用MapInfo Professional 进行空间数据查询、分析与数据转换
- oracle over()分析函数的使用实例
- 使用PHPExcel操作Excel用法实例分析
- 正确使用Android性能分析工具——TraceView
- 浅谈使用Rapidxml 库遇到的问题和分析过程(分享)
- 30.Linux-RTC驱动分析及使用
- 一次使用Eclipse Memory Analyzer分析Tomcat内存溢出
- 使用iostat分析IO性能