1 .最简单且最常见的define用法
#define N 100
1
编译器在预处理程序时,会将程序中所有的N用100来替换,换言之,不同于const常量,define其实本质上对文本内容的替换。
下面是define和const的区别:
define是宏定义,程序在预处理阶段将用define定义的内容进行了 替换 。因此在程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。
而const定义的常量,在程序运行时,存在常量表中,且系统为它分配内存。
define定义的常量,预处理时只是直接进行了替换,因此在编译时不能进行数据类型检验。
而const定义的常量,在编译时进行严格的类型检验,可以避免出错。
define定义表达式时要注意“边缘效应”。
例如:
#define N 1+2
float a = N/2.0;
/*
按照常规做法,可能会认为结果是3/2 = 1.5
但是实际上,结果应该为1+2/2.0 = 2.0
若想要实现3/2,则#define N (1+2)
即为避免边缘效应,一定要加!括!号!
*/
2 .用define定义函数
举个例子:
#include<stdio.h>
#define PI 3.14
#define S(r) PI*r*r
int main(void)
{
printf("area = %f", S(1+2));
rerturn 0;
}
结果:
3.14*1+2*1+2 = 3.14+2+2 = 7.14
重要的事情再说一遍:宏其实就是一个简单的文本替换!
3 .不常用的define用法
#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x
x##y表示x连接y
- 比如: int n = Conn(123,456);
- 结果: n=123456;
- char* str = Conn(“asdf”, “adf”);
- 结果: str = “asdfadf”;
而#@x,其实就是给x加上单引号,结果返回一个const char。
- 比如:char a = ToChar(1);
- 结果:a=’1’;
做个越界试验 char a = ToChar(123);结果是a=’3’; 但是如果参数超过四个字符,编译器就会报错!
至于#x,就是给x加上双引号
比如:char* str = ToString(123132);
结果:str=”123132”;
4 .定义宏和取消宏
定义宏使用#define
取消宏定义使用#undef
————————————————
版权声明:本文为CSDN博主「in_nocence」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/in_nocence/article/details/78982086
·关于我们·免责声明·服务条款·RSS订阅·dede168.com技术支持
Copyright © 1998-2015 All rights reserved.