#include<stdio.h>
int main()
{
printf("%s\n",__FILE__);//输出该文件所在具体位置
printf("%d\n",__LINE__);//行号 所以用%d
printf("%s\n",__DATE__);//目前所处的日期
printf("%s\n",__TIME__);//目前所处的时间
}
定义为常量时 将宏替换到代码中 是在预处理阶段
#define M 1000
#include<stdio.h>
int main()
{
int ret=M;
printf("%d\n",ret);
return 0;
}
#define reg register
#include<stdio.h>
int main()
{
reg int sum=1000;
return 0;
}
#deifne do_forever for(;;)
int main()
{
do_forever;//for(;;); 死循环
return 0;
}
#define M 1000;
int main()//这里程序会报错
{
int a=5;
int b=8;
if(a<10)
a=M;//这里宏替换后是 a=1000;; 多的分号自成一个语句 多个语句需要括号
else
b=0;
return 0;
}
#define name(parament-list) stuff 这里切记 name与左括号紧贴着 否则将会被视为转换内容 stuff的一部分
注意这里是要把整体传过去再运算
#define square (x) x*x
int main()
{
printf("%d\n",square(3+1));//3+1传过去替换x 3+1*3+1=7
return 0;
}
#define square(x) x+x
int main()
{
printf("%d\n",10*square(4));//将4传过去替换x 即10*4+4=44
return 0;
}
#作用是找到该对象所对应内容的字符串
#define PRINT printf("the value of" #x"is %d\n",x)
int main()
{
int a=10;
PRINT(a);
int b=5;
PRINT(b);
return 0;
}
只要是字符串 不管是几个 都能正常输出 #x代表x所对应的内容的字符串 替换过来 #x 为"a"/"b" printf("the value of " "a" "is %d\n",a);
##代表将两个字符连在一起
#define cat(x,y) x##y
int main()
{
int yourage=20;
printf("%d\n",cat(your,age));//将your和age连接起来 为yourage再计算 为20
return 0;
}
将 your##age--->yourage
#define max(x,y) x>y?x:y
int main()
{
int a=5;
int b=8;
int ret=max(a++,b++);
printf("%d\n",ret);
return 0;
}
将a++和b++替换带宏中为 a++>b++?a++:b++ a为5 b为8 5>8为假 表达式结束 两者都加1 a为6 b为9 传入 b++中 将b给予ret 即ret为9 表达式结束后 b加1 即b为10
用于移除宏定义
#define M 1000
int main()
{
int a=M;
#undef M
printf("%d\n",M);//这里会报错 因为 M的宏定义被移除了
return 0;
}
#ifdef 0
#define M 1000
int main()
{
int a=M;
printf("%d\n",a);
return 0;
}
#endif
#ifdef 0 0为假 不执行下面的内容 相当于//的作用
#include<stdio.h>
int main()
{
#ifdef 1==1//1==1为真 执行下面内容 输出hehe
printf("hehe\n");
#elif 1==2//为假 跳过下面内容
printf("hehe\n);
#else//都不成立 执行hehe
printf("hehe\n");
#endif
return 0;
#define PRINT
int main()
{
#ifdef PRINT
printf("hehe\n");//如果PRINT没定义 则不参与编译
#endif
return 0;
}