C语言中define的用法详解
宏——无非就是定义一个替换的量,好比#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的用法详解相关推荐
- sort在c语言中的作用,c语言中sort的用法详解.docx
c语言中sort的用法详解.docx C语言中SORT的用法详解C语言的学习很多是比较复杂的,那么C语言中SORT的用法的用法你知道吗下面学习啦小编就跟你们详细介绍下C语言中SORT的用法的用法,希望 ...
- c语言中for语句的用法及规则,C语言中for语句用法详解
请看正文 C语言中,for语句是三种循环控制语句之一.也是比较常用且执行效率较高的一种.本文将详细阐述for语句的用法及使用注意事项. 一.基本用法 for(;;) { 循环体语句; } C语言中,f ...
- C语言中scanf函数用法详解
scanf 的功能用一句话来概括就是"通过键盘给程序中的变量赋值".该函数的原型为: # include <stdio.h> int scanf(const char ...
- c语言中foreach的用法,详解JavaScript中的forEach()方法的使用
JavaScript数组的 forEach()方法调用数组中的每个元素. 语法 array.forEach(callback[, thisObject]); 下面是参数的详细信息: callback ...
- Java语言中include指令用法详解
incude指令的形式:<%@ include file="Header.jsp" %> 通过这种方式我们可以给页面添加统一的标题栏和footer栏,代码如下: 首先H ...
- C语言中fopen函数用法详解
fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式); 其中, "文件指针名"必须是被说明为FILE 类型的指针变量: " ...
- c语言中static关键字用法详解
概述 static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护. 但是对于c语言初学者,static由于使用灵活,并不容易掌握.本文就static在c语言中的应用进 ...
- #define c# 报错_c语言中#define的用法
c语言中#define的用法 C语言中,可以用 #define 定义一个标识符来表示一个常量.其特点是:定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了. 预编译又叫预处理.预编译 ...
- c语言中ANSI标准的关键字,C语言中32个关键字详解
C语言中32个关键字详解 由 ANSI 标准定义的 C 语言关键字共32个,根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类. 一.数据类型关键字 A 基本数据类型(5个) vo ...
最新文章
- 一个永远无法被初始化的指针:
- 保护linux系统调用,Linux软中断与系统调用
- csrf 攻击和防御
- php如何连接mongodb,PHP 连接 MongoDB
- nyoj-括号匹配(二)---动态规划
- web前端技术分享Electron之IPC 通信
- PHP关于VC11,VC9,VC6以及Thread Safe和Non Thread Safe版本选择
- FPGA的一些细节(持续更新)
- 【软件开发】软件开发注意事项
- DiskPart-删除磁盘分区
- 使用ssh登录华为云linux,mac远程ssh登陆华为云--linux版本
- 性能测试入门,其实很简单,看看这篇,好好学习
- 微服务实施笔记(五)——生产环境部署
- 期货止损篇2:ATR止损,高手都在悄悄用的止损利器
- devenv.exe - 系统错误无法启动此程序,因为计算机中丢失 MSVCR100.dll。尝试重新安装该程序以解决此问题。【解决办法】...
- windows IDT
- 实现类似淘票票电影滑动选择的效果
- 175Echarts - 象形柱图(Spirits)
- 【vue】修改props传进来的值
- 自由枪骑兵-Freelancer