目录
在C语言中凡是以“#”开头的均为预处理命令
一、预定义符号(预定义宏名):
c语言设置了一些预定义的符号(宏名),可以直接使用,在预处理阶段处理的,
__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义
__FUNCTION__ //进行编译的函数__FILE__
使用:
上述预定义符号可在日志中使用,记录相应的信息写到文件里
二、#define(宏定义):
1、对象式宏(类对象式宏): 宏替换 (定义符号)
使用时宏,我们用到的是宏定义中的宏名,理解为幻术,其实它本来是suff,但是在幻术下看到的是name这个标识符,可是幻术终归是幻术;预处理节点就会打破幻术,展现其本来的样子(宏替换)宇智波一族有点厉害哈
不接收参数,只是根据宏定义做简单的字符串替换操作.
定义常量:
MAX 为宏名 100为替换的内容 在预处理阶段会用100去替换掉所有用MAX这个标识符:
#define MAX 100//之后的MAX会替换成100
int main()
{
int a[MAX] = { 1,0 };
return 0;
}
定义关键字(具有特殊意义的标识符):
指的是c语言中自带的(或者说被赋予了特殊意义的)标识符;宏定义它 可以理解为给这个标识符弄出来了一个别名。好比有些歌手会用一个艺名类似。
//定义标识符
#define INT int
INT main()
{
INT a = 10;
printf("%d", a);
return 0;
}
简化关键字:有时候觉得关键字太长了,可以为它创建一个简短的名字
#define Cnt const
int main()
{
Cnt int a = 10;
printf("%d", a);
return 0;
}
其他的用法:
用更形象的标识符来替换一种实现;
#define do_forever for(;;)
int main()
{
//恭喜进入死循环,for循环里啥也没有就是死循环了
do_forever;
return 0;
}
在写case语句时,将break加上:
#define CASE break;case //在写case语句的时候自动把 break写上。
int main()
{
int i = 1;
switch (i)
{
case 1: // 等同于 case 1:
CASE 2 : //等同于barek; case 2:
CASE 3 : //等同于break; case 3: break;
break;
}
return 0;
}
定义的 stuff 过长时,我们可以分行写,除了最后一行都要加一个反\在后面表示续行
#define DEBUG_PRINT printf("file:%s\tline:%d\t \
date:%s\ttime:%S\n",\
__FILE__,__LINE__,\
__DATE__,__TIME__)
int main()
{
DEBUG_PRINT;
return 0;
}
是否要加分号:
从这些用法中,发现了么????我么都没有在宏定义末尾加“