#define用法总结

刚开始接触VC++的同学们,估计对这个东西有这莫大的恐惧。这个经常写在添加头文件的地方的奇怪语句。

如果看过mfc那么,那么拿出一些application framework里面的宏,估计会吓死一片。说了这么多只是想说,不明白其用法的人很害怕,但要是知道它,熟悉它,那么你会觉得它很美妙。

 

进入正题:

#define的个用法:

 

1:#define MAX  0x18

第一个用法意义就在于定义标识符,这个比较常见而且也比较容易理解。将MAX的地方看做是0x18。

 

2:#define afx_msg 

这个可能不常见,但实际上很常见,在mfc里面经常看到某个消息处理函数的前面就是afx_msg,但是究其根源会发现如上定义,

原来啊,#define可以将标识符定义为空,那么mfc为什么要定义呢,这个是项目规划的问题了。可能以后要在afx_msg后面添加

什么东西呢,但更重要的这种宏可以用于提供附加信息。一个用afx_msg修饰的函数,可以让读者很容易知道这个函数是一个处理消息的函数!且这个用经常用在头文件包含方面,后面会讲。

 

3:#define MAX(a,b)  a>b?a:b

这个就是#define最大的用处了可以说,这个称为定义宏。可以当函数使用。但为什么可以当函数使用呢?就在于#define的根本,

不管他是定义标识符也好,定义宏也好,说本质就是个文本替换。所以有了上面的宏定义。那么你可以写出这样的代码。

 

#define MAX(a,b) a>b?a:b

 

void main()

{

 int a=1;

 int b=2;

 int c=MAX(a,b);

}

 

那么关键的那行代码就在编译的时候被替代成:int c=a>b?a:b;这是?:语法。大家都知道可以得到最大值。

不过呢?实际使用的时候我们采取一个原则,分层加括号原则,上面的宏采用这个原则改写后:

#define MAX(a,b) (a>b?a:b)

 

为什么要这么写呢?请看下面代码:

int c = a * MAX(a,b);

如果采用一开始的写法,展开如下:

int c = a * a >b?a:b;

看到了,最大值比较的是a*a和b。所以出错了!

但采用分层之后就肯定不会错了,分层加括号方法展开如下:

int c = a * (a > b? a: b);

 

所以大家以后写宏的时候记得要用分层加括号原则。

 

4:#define TOSTR(x) #x

其实这也是宏,只不过用来引出几个宏定义中常用的语法。

上面的宏将x变成字符串x。下面是三个常用的:

#define TOSTR(X) #X                               //TOSTR(xujie)代表:"xujie"

#define ADDPRE(X) add##X                    //ADDPRE(xujie)代表:addxujie        //注意这可不是字符串

#define TOCHAR(X) #@x                          //TOCHAR(x)代表:'x'

 

#代表:将宏参数转换成字符串

##代表:将##左右的标识符连接成一个,但不是字符串

#@代表:将宏参数转换成单个字符

 

5:#define IMPLEMENT_SERIAL(theClass,baseClass)     IMPLEMENT_DYMCREATE(theClass,baseClass)/

      CObject* PASCAL CreateObject() {/

      return cass##theClass}

这是一个三行宏,那么其实语法就一点,#define后面出现的第一个标识符,将代替后面多行代码。同一宏之间的多行代码用/连接在一起。

 

用上简单的宏语法在加上多行注释,再加上Microsoft那帮疯子,就出现了我们mfc里面精妙绝伦的宏了。

也请注意将#define和typedef做区别,前几个博客已经讲明了。

 

时间: 2024-08-02 17:23:56

#define用法总结的相关文章

php中define用法实例_php技巧

本文实例讲述了php中define用法.分享给大家供大家参考.具体如下: <?php /* * define * */ /*第3个参数: * false -- 对大小写敏感(默认) * true -- 对大小写不敏感 * */ define("pai",3.14); define ("name","LiLei",true); function testfor($x) { for($a=$x;$a<=12;$a++) { echo &q

c/c++ define用法

define,无参宏定义的一般形式为:#define 标识符 字符串 外文名 define 词条范围 计算机专业用语 无参一般形式 #define 标识符 字符串 带参一般形式 #define 宏名(形参表) 字符串 目录 1参数 2作用 3宏定义优点 4无参宏定义 5带参宏定义 6PHP用法 7例子  例子 1  例子 2     1参数编辑 #define GPEBLT_FUNCNAME(basename) (SCODE (GPE::*)(struct GPEBltParms *))&GPE

Linux c中define的用法小结_C 语言

define的用法只是一种纯粹的替换功能,宏定义的替换是预处理器处理的替换. 一:简单的宏定义用法 格式:#define 标识符 替换内容 替换的内容可以是数字,字符,字符串,特殊字符和空格,后面是什么内容就会替换成什么内容. 例如: #define  N   5 效果等同于 int  array [5]; int  array[N]; 同样效果: #define N = 5 int array[N];    效果等同于 int  array[= 5]; 同样效果: #define N   5;

Define,const,static用法总结_C 语言

1.Define用法:define主要是用于宏常量定义的,使程序看起来更简洁明了,方便代码维护,#define定义的实质只是一个常数的名字,没有具体数据类型的,没有分配内存空间.在编译是会被编译器替换为该常数.每次使用该宏定义,就要进行编译并分配空间,若一个程序中多次使用define定义的数据,则就会有多份拷贝.这么做是为了提高程序的可读性,但安全性相对差点. 2.const用法:const定义的全局数据变量,其基本作用和define相同,但又在define的基础上增加了好多功能.const定义

c-C语言中#define的问题

问题描述 C语言中#define的问题 我在学CUDA的时候看到库文件driver_type.h中的一个定义 typedef device_builtin enum cudaError cudaError_t; 看不懂这是什么意思. cudaError_t是新定义类型. cudaError的定义是:enum device_builtin cudaError{...} device_builtin是: #define device_builtin 我不明白这里的__device_builtin__

浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结_javascript技巧

这是一篇关于javascript模块化AMD,CMD,CommonJS的学习总结,作为记录也给同样对三种方式有疑问的童鞋们,有不对或者偏差之处,望各位大神指出,不胜感激. 本篇默认读者大概知道require,seajs的用法(AMD,CMD用法),所以没有加入使用语法. 1.为何而生:  这三个规范都是为javascript模块化加载而生的,都是在用到或者预计要用到某些模块时候加载该模块,使得大量的系统巨大的庞杂的代码得以很好的组织和管理.模块化使得我们在使用和管理代码的时候不那么混乱,而且也方

彻底搞清楚javascript中的require、import和export

为什么有模块概念 理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Javascript不是一种模块化编程语言,在es6以前,它是不支持"类"(class),所以也就没有"模块"(module)了. require时代 Javascript社区做了很多努力,在现有的运行环境中,实现"模块"的效果. 原始写法 模块就是实现特定功能的一组方法.只要把不同的函数(以及记录状态的变量)简单地放在一起,就算是一个模块.

c++中#define 与const用法有什么区别? 如下的程序错在了什么地方?

问题描述 c++中#define 与const用法有什么区别? 如下的程序错在了什么地方? #include using namespace std; #define pi 3.1415; const float PI=3.14; int main() { system("color 4A"); float s1,s2,r; cin>>r; s1=PI*r*r; s2=pi*r*r; cout<<"s1="<<s1<<

typedef和#define的用法以及区别_C 语言

一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef    int       INT;typedef    int       ARRAY[10];typedef   (int*)   pINT; typedef可以增强程序的可读性,以及标识符的灵活性,但它也有"非直观性"等缺点. 二.#define的用法 #define为一宏定义语句,通常用它来定义常量(包括无参