宏——无非就是定义一个替换的量,好比#define PI 3.1415926,这样的功能,再深一点就是写一个类似函数的定义,好比#define MAX(a,b) ((a) > (b) ? (a) : (b))这样的功能。下面讲解一下具体用法:

一、简单的define定义

#define MAXTIME 1000

一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写

if(i<MAXTIME){.........}

编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。
这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是简单的文本替换,而不是作为一个量来使用,这个问题在下面反映的尤为突出。

二、define的“函数定义”

define可以像函数那样接受一些参数,如下

#define max(x,y) (x)>(y)?(x):(y);

这个定义就将返回两个数中较大的那个,看到了吗?因为这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。
但是这样做的话存在隐患,例子如下:

#define Add(a,b) a+b;

在一般使用的时候是没有问题的,但是如果遇到如:c * Add(a,b) * d的时候就会出现问题,代数式的本意是a+b然后去和c,d相乘,但是因为使用了define(它只是一个简单的替换),所以式子实际上变成了:

c*a + b*d

另外举一个例子:

#define pin (int*);
pin a,b;

本意是a和b都是int型指针,但是实际上变成int* a,b;
a是int型指针,而b是int型变量。
这是应该使用typedef来代替define,这样a和b就都是int型指针了。
所以我们在定义的时候,养成一个良好的习惯,建议所有的层次都要加括号

三、宏的单行定义(少见用法)

#define A(x) T_##x
#define B(x) #@x
#define C(x) #x

我们假设:x=1,则有:
A(1)------〉T_1
B(1)------〉‘1’
C(1)------〉“1”

四、define的多行定义

#define可以进行多行定义,这是一个非常经典而且在设备驱动代码中经常要用到的一个方法,格式如下:

#define MACRO(arg1,arg2) do {  \
stmt1; \
stmt2; \
}while(0)

TIP:在每一行的末尾要加上\,切记!
在大规模的开发过程中,特别是跨平台和系统的软件里,define最重要的功能是条件编译。

五、定义宏和取消宏定义的方法

定义一个宏使用#define,取消一个宏定义使用#undef

//定义宏
#define (MacroName) (MacroValue)
//取消宏
#undef (MacroName)

六、使用宏进行条件编译

格式如下:#ifdef … (#else) … #endif

#ifdef HELLO
#define WORLD 1
#else
#define WORLD 0
#endi

七、用define来处理头文件被头文件或者源文件包含的情况

由于头文件包含可以嵌套,那么c文件有可能包含多次同一个头文件,就会出现重复定义的问题的,那么可以就通过条件编译开关来避免重复包含,如下:

 #ifndef _HELLO_H_#define _HELLO_H_...//文件内容...#endif

参考资料:
《C Primer Plus(第六版)中文版》
《C和指针》
网上总结的文档,因有太多类似的,故不给出具体链接!

C语言中define的用法详解相关推荐

  1. sort在c语言中的作用,c语言中sort的用法详解.docx

    c语言中sort的用法详解.docx C语言中SORT的用法详解C语言的学习很多是比较复杂的,那么C语言中SORT的用法的用法你知道吗下面学习啦小编就跟你们详细介绍下C语言中SORT的用法的用法,希望 ...

  2. c语言中for语句的用法及规则,C语言中for语句用法详解

    请看正文 C语言中,for语句是三种循环控制语句之一.也是比较常用且执行效率较高的一种.本文将详细阐述for语句的用法及使用注意事项. 一.基本用法 for(;;) { 循环体语句; } C语言中,f ...

  3. C语言中scanf函数用法详解

    scanf 的功能用一句话来概括就是"通过键盘给程序中的变量赋值".该函数的原型为: # include <stdio.h> int scanf(const char ...

  4. c语言中foreach的用法,详解JavaScript中的forEach()方法的使用

    JavaScript数组的 forEach()方法调用数组中的每个元素. 语法 array.forEach(callback[, thisObject]); 下面是参数的详细信息: callback ...

  5. Java语言中include指令用法详解

    incude指令的形式:<%@ include file="Header.jsp" %> 通过这种方式我们可以给页面添加统一的标题栏和footer栏,代码如下: 首先H ...

  6. C语言中fopen函数用法详解

    fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式); 其中, "文件指针名"必须是被说明为FILE 类型的指针变量: " ...

  7. c语言中static关键字用法详解

    概述 static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护. 但是对于c语言初学者,static由于使用灵活,并不容易掌握.本文就static在c语言中的应用进 ...

  8. #define c# 报错_c语言中#define的用法

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

  9. c语言中ANSI标准的关键字,C语言中32个关键字详解

    C语言中32个关键字详解 由 ANSI 标准定义的 C 语言关键字共32个,根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类. 一.数据类型关键字 A 基本数据类型(5个) vo ...

最新文章

  1. 一个永远无法被初始化的指针:
  2. 保护linux系统调用,Linux软中断与系统调用
  3. csrf 攻击和防御
  4. php如何连接mongodb,PHP 连接 MongoDB
  5. nyoj-括号匹配(二)---动态规划
  6. web前端技术分享Electron之IPC 通信
  7. PHP关于VC11,VC9,VC6以及Thread Safe和Non Thread Safe版本选择
  8. FPGA的一些细节(持续更新)
  9. 【软件开发】软件开发注意事项
  10. DiskPart-删除磁盘分区
  11. 使用ssh登录华为云linux,mac远程ssh登陆华为云--linux版本
  12. 性能测试入门,其实很简单,看看这篇,好好学习
  13. 微服务实施笔记(五)——生产环境部署
  14. 期货止损篇2:ATR止损,高手都在悄悄用的止损利器
  15. devenv.exe - 系统错误无法启动此程序,因为计算机中丢失 MSVCR100.dll。尝试重新安装该程序以解决此问题。【解决办法】...
  16. windows IDT
  17. 实现类似淘票票电影滑动选择的效果
  18. 175Echarts - 象形柱图(Spirits)
  19. 【vue】修改props传进来的值
  20. 自由枪骑兵-Freelancer

热门文章

  1. AT89C51单片机的数字电压表开发,量程0~5V,proteus仿真,原理图PCB和C程序等
  2. 年终盘点!2017年超有价值的Golang文章
  3. centos7安装gitLab
  4. getchar函数与缓冲区的细节问题
  5. RMSE平方根误差的意外?
  6. 冯雷老师:唐僧的BISI领导力模型是怎样的?
  7. 电脑无格式复制粘贴文本
  8. python中类的命名规则_python命名规则
  9. 计算机专业应该学什么
  10. Abaqus流固耦合实例——Front-load washing machine