#include <stdio.h>
#define PI 3.14159 //宏---文本替换
//在C99之前没有const,只能用define
#define FORMAT "%f\n"
//编译时会用"%f\n"替换FORMAT
//名字必须是一个单词,值可以是各种东西
//完全的文本替换
int main ()
{
//预定义的宏
printf("%d\n",__LINE__) ;//当前行号
printf("%s\n",__FILE__) ;//当前源文件的名称,用字符串常量表示
//D:\CSS\hello.c
printf("%s\n",__DATE__) ;//当前源文件编辑日期
//Jul 25 2020
printf("%s\n",__TIME__) ;//当前源文件的最新编译吋间,用“hh:mm:ss”形式的宁符串常量表示
printf("%d\n",__STDC_VERSION__) ;//如果当前编译器符合C89,那么它被定义为199409;如果符合C99,那么它被定义为199901:在其他情况下,该宏为末定义
return(0);
}
#include <stdio.h>
#define cube(x) ((x)*(x)*(x)) //带参数的宏
//用 ((x)*(x)*(x))替换 cube(x)
//防止出错:都用()
//执行效率比函数高
#define MIN(a,b) ((a)>(b)?(b):(a)) //多参数的宏
int main ()
{
printf("%d\n",cube(3));
return(0);
}
利用宏传递参数类型
还有一些任务根本无法用函数实现,但是用宏定义却很好实现。比如参数类型没法作为参数传递给函数,但是可以把参数类型传递给带参的宏
看下面的例子:
#define MALLOC(n, type) \
( (type *) malloc((n)* sizeof(type)))
利用这个宏,我们就可以为任何类型分配一段我们指定的空间大小,并返回指向这段空间的指针。我们可以观察一下这个宏确切的工作过程:
int *ptr;
ptr = MALLOC ( 5, int );
将这宏展开以后的结果:
ptr = (int ) malloc ( (5) sizeof(int) );
这个例子是宏定义的经典应用之一,完成了函数不能完成的功能
## 拼接
#define test1(i) test(x##i)
int main()
{
int x1=1, x2=2, x3=3;
test1(1); // 相当于 test(x1)
test1(2); // 相当于 test(x2)
test1(3); // 相当于 test(x3)
return 0;
}