1.#define定义标识符
在C语言程序中,有时候会包含#define
#define可以定义标识符
也就是说可以对字符重新定义,实现代替的作用
语法
#define name stuff
就比如说:
#define MAX 1000(用MAX代替1000)
#define reg register (用reg代替register)
举个栗子
#include#define MAX 100 int main() { printf("%d", MAX); return 0; }
当代码运行的时候
在代码编译的预处理阶段 就会把宏替换为文本程序代码
代替的结果如下:
#includeint main() { printf("%d", 100); return 0; }
注意:#define定义标识符后面尽量不加上分号,因为如果加上的话,在替换的过程中,分号也会别替换到文本程序中,有时候会导致出现逻辑错误。
2.#define定义宏
#define规定允许将参数替换到文本中,这样包含参数叫做#define定义宏
宏在程序中,执行的速度更快,因为相对于函数,宏没有函数的调用和返回的开销
语法:
#define SQUARE(x) x*x
这与#define定义宏一样,都是完成替换的,不过#define定义宏后面有一个括号,包含参数
下面用#define定义宏来实现两个数求最大值
#include#define MAX(x,y) ((x)>(y)?(x):(y)) int main() { int a = 20; int b = 10; int c = MAX(a,b); printf("%d", c); return 0; }
替换后的结果为:
#includeint main() { int a = 20; int b = 10; int c = a>b?a:b; printf("%d", c); return 0; }
在#define定义宏的时候,后面的参数尽量带上括号,使每一个参数相对独立
这样可以避免由于操作符的优先级不同,导致最终的逻辑就错了
举个栗子:
#include#define sum(x) x*x int main() { int ret = sum(3 + 3); printf("%d", ret); }
如果不仔细观察的话,可能你认为的结果就是36
这个代码的计算过程为:3+3*3+3,并不是(3+3)*(3+3)
#define替换的规则
#define定义标识符和宏时,程序会继续如下步骤
1.在定义宏时,先对参数进行检查,如果参数里包含有#define定义的标识符时,首先完成相应的替换
2.替换文本会随后插入到原来文本文件中,对于宏来说,参数名被他们的值所替换
3.最后进行检查,果然还有#define定义的符号,将重复上述的操作
注意:
1.#define参数中可以包含其他由#define定义的标识符,但是#define不能递归
2.如果#define的参数名存在在字符串中,将不会完成替换
#与## #的用法:
在不确定参数的情况下,可以使用 “#n” ,可以实现不同字符串的插入
效果如下:
#include#define PRINT(n) printf("the value of "#n" is %d\n",n); int main() { int a = 10; PRINT(a); int b = 20; PRINT(b); int c= 30; PRINT(c); return 0; }
替换后的效果为:
#includeint main() { int a = 10; printf("the value of" "a" " is %d\n",a); PRINT(a); int b = 20; PRINT(b); printf("the value of " "b" " is %d\n",b); int c= 30; PRINT(c); printf("the value of " "c" " is %d\n",c); return 0; }
##的用法:
#include#define CAT(Max,num) Max##nu int main() { int Maxnum = 100; printf("%d", Maxnum); return 0; }
双##的用法可以拼接两个字符串
当然这个前提是拼接后的字符串必须产生一个合法的标识符,否则结果就是未定义的
宏的缺点
1.如果使用宏过多,宏定义的代码插入到程序中,会大幅度增加程序的长度
2.宏是没法调试的
3.宏与类型无关,导致程序不够严谨
4.宏会带来优先级的问题,容易导致程序的错误
宏和函数的优缺点
1).在代码长度角度上,因为宏是直接替换所以若宏较长会增加代码长度
2).在执行速度上,宏较函数快,因为函数存在调用/返回时的额外开销
3).在参数求值方面,define定义的宏可能会具有副作用会导致修改变量最后的值,而函数即使调用多次也不会修改变量原来的值
4).在参数类型方面,宏与类型无关,所以宏是可以传参数的而函数不行在C中函数是不可以传类型的
5).在是否可调试方面,宏不可调试,函数可调试宏可以传类型的检测,实现malloc(动态开辟内存的函数)
#include#include #define MALLOC(COUNT,TYPE)\ (TYPE *)alloc(COUNT*sizeof(TYPE)) void *alloc(int sz) //宏可以传类型,函数不可以传类型 { void *p=malloc(sz); if(p == NULL) { printf("out of memory\n"); exit(EXIT_FAILURE); } return p; } int main() { int i=0; int *p=MALLOC(10,int); for(i=0;i<10;i++) { *(p+i)=i; } for(i=0;i<10;i++) { printf("%d ",*(p+i)); } free(p); system("pause"); return 0; }
总结
到此这篇关于C语言中#define定义的标识符和宏的文章就介绍到这了,更多相关C语言#define定义标识符和宏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!