原
语法
#define PI 3.14
//定义一个M,值为3.14
#define DO_FOREVER for(;;)
//定义一个死循环
#define REG register
//定义REG来作为register的别名
#define CASE break;case
//在switch中用CASE来补上break;
#define DEBUG_PRINT printf("file:%s\tline:%d\tdate:%s\ttime:%s\n",\
__FILE__, __LINE__, __DATE__, __TIME__);
//测试预定义符号
1. 在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先被替换。
1、宏函数不能出现递归
;
例如:
;
#define M 100;
if (condition)
m = M;
else
max = 0;
宏函数申明格式:
#define SQARE( X ) X*X
//定义一个计算乘方的宏函数
#define SQUARE(X) X*X
int main()
{
int a = 5;
printf("%d\n", SQUARE(a+1));
return 0;
}
$ gcc -E test.c -o test.i
来查看预处理后的代码#define DOUBLE(X) (X) + (X)
int main()
{
int a = 5;
printf("%d\n", 10 * DOUBLE(a));
return 0;
}
在C语言中
#define PRINT(FORMAT, VALUE) printf("the value of " #VALUE " is "FORMAT"\n", VALUE)
int main()
{
int i = 0;
PRINT("%d", i + 3);
return 0;
}
#VALUE被替换成了“i + 3”
#define ADD_TO_AN(num, value) a##num += value
int main()
{
int a1 = 0;
int a2 = 0;
ADD_TO_AN(1, 5);
ADD_TO_AN(2, 6);
return 0;
}
##的作用
宏的优点:
>
来比较的类型。宏的参数与类型无关的#define MALLOC(num, type) (type *)malloc(num * sizeof(type))
MALLOC(10, int);//类型作为参数
//预处理器替换之后:
(int *)malloc(10 * sizeof(int));
宏的缺点:
当有一部分功能既可以用函数实现也可以用宏实现,且在调用函数的过程与宏使用过程所消耗的资源相当时,优先考虑代码的严谨性,使用函数
当宏参数在宏的定义中出现超过一次的时候,如果参数带有副作用,那么你在使用这个宏的时候就可能出现危险,导致不可预测的后果。副作用就是表达式求值的时候出现的永久性效果。
#define MAX(a, b) ( (a) > (b) ? (a) : (b) )
x = 5;
y = 8;
z = MAX(x++, y++);
printf("x=%d y=%d z=%d\n", x, y, z);
//结果为x=6 y=10 z=9
++
运算和--
运算1. 宏名全部大写
不是大佬,一起学习进步?(3个月前)举报回复
详解宏定义(#define)
08-28 98
什么是宏定义?
03-04 1166
1.不带参数的宏定义:
宏定义又称为宏代换、宏替换,简称“宏”。
格式:
#define 标识符 字符串
其中的标识符就是所谓的符号常量,也称为“宏名”。
预处理(预编译)工作…
来自: 小虾米