刚开始接触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做区别,前几个博客已经讲明了。

#define用法总结相关推荐

  1. #define 用法

    #define用法 收藏 1.简单的define定义 #define MAXTIME 1000 一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写 if(i<MAXTIME){ ...

  2. C:#define用法

    #define用法 C语言中,可以用 #define 定义一个标识符来表示一个常量. 其特点是:定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了. 预编译又叫预处理.预编译不是编译 ...

  3. c++ 预处理命令 #define用法

    预处理命令 #define用法 #define命令 #define命令 #define命令用于把指定的字符串替换文件中的宏名称 . 也就是说, #define使编译器把文件中每一个macro-name ...

  4. [define的用法]define用法集锦

    篇一 : define用法集锦 Definition: The #define Directive You can use the #define directive to give a meanin ...

  5. c++中define用法

    c++中define用法 define在c++语言中用法比较多,这里对其进行整理. 1.无参宏定义 无参宏的宏名后不带参数. 其定义的一般形式为: #define  标识符  字符串 1 其中的&qu ...

  6. #define用法以及#define和typedef区别

    1.简单的define定义 #define MAXTIME 1000 2.define的"函数定义" define可以像函数那样接受一些参数,如下 #define max(x,y) ...

  7. C++中#define用法

    http://blog.sina.com.cn/s/blog_686188ef0100klku.html #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一 ...

  8. 转载--#define 用法

    作者:Jency Lee 链接:http://www.cnblogs.com/Jency/articles/C_Cplusplus_define.html 1.简单的define定义 #define ...

  9. [C/C++]#ifndef,#define用法

    文件中的#ifndef 头件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都include了同一个头文件.而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了, ...

  10. C++ #define用法详解

    #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能理解该命令的本质,总是在此处产生一些困惑,在编程时误用该 ...

最新文章

  1. XGBoost算法原理解释(转载)
  2. 如何用初中知识理解机器学习到底在干什么事情
  3. 一笔画问题 (DFS或并查集)
  4. java 线程同步的方法_Java多线程同步方法
  5. GraphPad Prism多数据处理实用技巧
  6. 帝国CMS附件大小限制
  7. Java异常处理和常用类
  8. linux停止python程序_python – Linux上的多处理进程终止失败
  9. C++ explicit的作用
  10. Linux系统编程15:进程控制之如何创建进程和写时拷贝技术
  11. 低代码工具是软件维护的噩梦?
  12. jquery serialize 和 console 漫谈
  13. oracle数据库有64位的吗,plsql有64位的吗
  14. postman前置脚本密码MD5加密以及转大写
  15. 十一.TensorFlow之可视化好帮手B
  16. firefox浏览器window.event is undefined问题
  17. 02. Docker安装记录卸载
  18. 用两条命令看出你买的H3C光模块是否是正品
  19. YOLOv5目标检测全流程:从标注数据到检测模型
  20. 计算机网络的五层模型和七层模型

热门文章

  1. 在多少进制的计算下,可以让圆周率和黄金分割点变成该进制下的有理数?
  2. matlab等高线默认条数,Matlab等高线出现多条的原因是是什么?
  3. 嵌入式培训学校怎么选?嵌入式学习还有就业优势吗?
  4. 近乎完美的行走于虚拟世界?Pathbender推出跑步机StriderVR
  5. 光学三维测量-核心期刊
  6. 详述循环冗余校验CRC(附代码)
  7. Tribon图纸中Symbols符号的解析
  8. 前端入门学习笔记五十五
  9. Codeforces H. Ancient Wisdom
  10. mysql workbench 修改字体大小