目录
- 以“#”开头的均为预处理指令;
- 预处理是在编译前对源码的文本操作;
一,预定义符号
- C语言已预先定义好的内置符号(预定义宏);
- 可用于日志信息,以便于调试等;
__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
__STDC__ //如文件编译器遵循ANSI C,其值为1,否则未定义(gcc支持、vs不支持)
int main()
{
printf("%s\n", __FILE__); //F:\VS\Project1\test.c
printf("%d\n", __LINE__); //1990
printf("%s\n", __DATE__); //Aug 1 2021
printf("%s\n", __TIME__); //10:23 : 43
}
二,#define
-
可分为无参数宏定义和带参数宏定义;
-
标识符习惯全部大写,以区分变量名;
#define定义的标识符
#define name stuff
- 预处理阶段时,替换;
- 末尾建议不要加(;),否则多一个空语句或语法错误;
- 也可称为无参宏定义;
#define MAX 1000 //可替换数值
#define reg register //可替换关键字
#define do forever for(;;) //可替换一段语句
#define CASE break;case //可替换一段代码
//可替换多行代码(\续行符)
#define DEBUG_PRINT printf("file:%s\tline:%d\tdate:%s\ttime:%s\n",\
__FILE__, __LINE__, \
__DATE__, __TIME__)
#define定义宏
- 允许把参数替换到文本中,称为宏(macro)或定义宏(define macro);
#define name( parament-list ) stuff
- parament-list 参数列表,会在stuff中完成替换;
- 括号()必须紧邻name;
- 也可称为带参宏定义;
#define SQUARE(x) x*x
int main()
{
int ret = SQUARE(4); //先传参,在替换
printf("%d", ret);
}
//结果:16
注:
- 宏是先替换,在计算的;
- 对数值表达式进行求值的宏定义,应加上括号,避免在使用宏时由于参数中的操作符和邻近操作符之间产生歧义;

文章详细介绍了C语言中的预处理指令,包括预定义符号如__FILE__和__LINE__,#define用于宏定义,无参数和带参数的宏,以及#和##的用法。还讨论了带副作用的宏参数、宏与函数的对比、命令行定义、条件编译、文件包含(头文件包含)以及其他预处理指令的应用。这些内容对于理解和编写C程序至关重要。
最低0.47元/天 解锁文章
2273





