目录
C 预编译宏
宏(Macro)是在对源代码进行编译前,对里面特定的内容进行替换
#include <stdio.h>
#define Pi 3.1415926
#define total 100
#define name "Tom"
#define Max(x,y) (x>y? x:y)
#define P_out(x) printf("it is %s\n",#x)
//#undef Pi
//取消宏的定义
int main()
{
printf("Pi为%.7f\n",Pi);
printf("total为%d\n",total);
printf("name为%s\n",name);
int m=Max(12,15);
printf("使用带参数的宏进行比大小,得到%d\n",m);
P_out("dcff");
return 0;
}
结果如下
Pi为3.1415926
total为100
name为Tom
使用带参数的宏进行比大小,得到15
it is "dcff"
我们从例子中可以看到,其实宏和定义类型变量是很类似的,我们同样可以在main函数中定义
float PI=3.1415926;
int TOTAL=100;
char* NAME="Tom";
但是普通定义只能在main函数内起作用,而宏是在编译预处理时预处理器对宏进行处理,在这之后,对程序中出现的宏名称将其替换为它的定义,比如将PI替换成3.1415946。
我们为什么需要宏?通过宏,我们可以很方便的使用一些全局变量,而且由于宏是在预处理时进行文本替换,相对定义变量,减少了程序编译的时间。
我们上面介绍的是不带参数的宏,即他只是用来定义一些变量的。
带参数的宏:#define max(x,y) (x>y? x:y)
#运算符——宏:#define p_out(x) printf("it is %s\n",#x)
取消宏:#undef Pi
,当某个宏首次遇到它的 #undef 命令时,它的作用域就会结束。如果没有关于该宏的 #undef 命令,那么它的作用域在该翻译单元结束时终止。
在宏内使用宏
// fn_tbl.c: 以表格形式输出一个函数的值。该程序使用了嵌套的宏
// -------------------------------------------------------------
#include <stdio.h>
#include <math.h> // 函数cos()和exp()的原型
#define PI 3.141593
#define STEP (PI/8)
#define AMPLITUDE 1.0
#define ATTENUATION 0.1 // 声波传播的衰减指数
#define DF(x) exp(-ATTENUATION*(x))
#define FUNC(x) (DF(x) * AMPLITUDE * cos(x)) // 震动衰减
// 针对函数输出:
#define STR(s) #s
#define XSTR(s) STR(s) // 将宏s展开,然后字符串化
int main()
{
double x = 0.0;
printf( "\nFUNC(x) = %s\n", XSTR(FUNC(x)) ); // 输出该函数
printf("\n %10s %25s\n", "x", STR(y = FUNC(x)) ); // 表格的标题
printf("-----------------------------------------\n");
for ( ; x < 2*PI + STEP/2; x += STEP )
printf( "%15f %20f\n", x, FUNC(x) );
return 0;
}
输出如下
FUNC(x) = (exp(-0.1*(x)) * 1.0 * cos(x))
x y = FUNC(x)
-----------------------------------------
0.000000 1.000000
0.392699 0.888302
0.785398 0.653696
1.178097 0.340154
1.570796 -0.000000
1.963496 -0.314461
2.356195 -0.558672
2.748894 -0.701831
3.141593 -0.730403
3.534292 -0.648818
3.926991 -0.477461
4.319690 -0.248449
4.712389 0.000000
5.105089 0.229683
5.497788 0.408056
5.890487 0.512619