目录
1 有值的宏
以#开头的语句是编译预处理语句,不参与代码的编译。例如#define语句就是一个宏定义语句。宏定义有一些特点:
语法:#define <名字> <值>
(1)该语句没有分号,因为不属于代码一部分。该代码不参与编译,在编译前就把代码中所以的名字替换成值(存文本替换);
(2)名字必须是一个单词,值可以是任何东西;
(3)宏中可以包含其他宏;
(4) 宏后的注释不属于宏;
(5)宏可以用/换行;
调试代码如下所示:
#include<stdio.h>
#define pi 3.141592
#define pi_plus_1 pi+1
#define output printf("pi=%lf\n",pi);\
printf("pi_plus_1=%lf",pi_plus_1)
void main(void)
{
output;
}
运行结果为:
pi=3.141592
pi_plus_1=4.141592
2 没有值的宏
一般用来条件编译,例如定义一个#define debug,在代码以后来判断有没有定义过这个宏,如果有,编译代码段1,如果没有,编译代码段2。
C语言中有一些内置的宏定义分别是:
__FILE__//替代文件名称
__LINE__//替代代码所在行
__DATE__//替代日期
__TIME__//替代时间
实例代码:
#include<stdio.h>
void main(void)
{
printf("本代码的文件名是:%s\n",__FILE__);
printf("本语句的行序号是:%d\n",__LINE__);
printf("当前时间是:%s %s",__DATE__,__TIME__);
}
运行结果为:
本代码的文件名是:hong2.c
本语句的行序号是:6
当前时间是:Aug 18 2022 19:40:04
3 带参数的宏
宏亦可以带上参数,如下代码所示:
#include<stdio.h>
#define cube(x) ((x)*(x)*(x))
void main(void)
{
printf("%d",cube(3));
}
此时,宏定义的名字类似于函数名,值类似于函数表达式。不同的是,此处的宏依然是纯文本替代。为了避免出现运算优先级的问题,进行带参数的宏定义的时候需要在所有有参数的地方加上(),最后还要将整个值加上括号。
本文含有隐藏内容,请 开通VIP 后查看