1.预定义符号
预定义符号用于预处理期间,便于预处理的进行。
预定义符号是由编译器预先设置好的特殊标识符,用于表示特定的信息,如编译器版本、目标平台信息、编译选项等。在C语言中,常见的预定义符号包括:
__LINE__
:表示当前源码行号。
__FILE__
:表示当前源文件名。
__DATE__
:表示文件被编译的日期。
__TIME__
:表示文件被编译的时间。
__FUNCTION__
:表示进行编译的函数。
__STDC__
:如果编译器遵循ANSI C,其值为1,否则未定义。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
printf("%s\n", __FILE__);
printf("%d\n", __LINE__);
printf("%s\n", __DATE__);
printf("%s\n", __TIME__);
printf("%s\n", __FUNCTION__);
return 0;
}
2.#define定义常量
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define a 100
#define student "lishi"
#define DEBUG_PRINT printf("file:%s\tline:%d\t \
date:%s\ttime:%s\n" ,\
__FILE__,__LINE__ , \
__DATE__,__TIME__ )
int main()
{
char arr[] = student;
int b = a;
printf("%d\n", b);
printf("%s\n", arr);
DEBUG_PRINT;
return 0;
}
每⾏的后⾯都加⼀个反斜杠(续⾏符)。
3.#define定义宏
#define MUL(x) x*x
#define ADD(y) y+y
int main()
{
int n = 5;
printf("%d\n", MUL(n));
printf("%d\n", MUL(n + 1));//5+1*5+1
printf("%d\n", ADD(n));
printf("%d\n", 10 * ADD(n));//10*5+5
return 0;
}
在使用中注意()
所以⽤于对数值表达式进⾏求值的宏定义都应该⽤这种⽅式加上括号,避免在使⽤宏时由于参数中的操作符或邻近操作符之间不可预料的相互作⽤。
#define MUL(x) (x*x)
#define ADD(y) ((y)+(y))
int main()
{
int n = 5;
printf("%d\n", MUL(n));
printf("%d\n", MUL(n + 1));
printf("%d\n", ADD(n));
printf("%d\n", 10 * ADD(n));
return 0;
}
4.宏和函数的区别
带副作用的宏参数
int max(int z, int d)
{
return((z++) > (d++) ? (z++) : (d++));
}
#define MAX(x,y) ((a++)>(b++)?(a++):(b++))
int main()
{
int a = 1;
int b = 5;
int z = 1;
int d = 5;
MAX(a, b);
printf("%d\n", a);
printf("%d\n", b);//(b++)会执行
int x=max(z, d);
printf("%d\n", x);
return 0;
}
宏和函数的对比: