完全自学C(干货) —— 预处理详解

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

目录

一,预定义符号

二,#define

#define定义的标识符

#define定义宏

# 和 ##

带副作用的宏参数

宏和函数的对比

#undef

三,命令行定义

四,条件编译

五,文件包含 #include

头文件包含方式

嵌套文件包含

六,其他预处理指令


  • 以“#”开头的均为预处理指令;
  • 预处理是在编译前对源码的文本操作;

一,预定义符号

  • 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

注:

  • 宏是先替换,在计算的;
  • 对数值表达式进行求值的宏定义,应加上括号,避免在使用宏时由于参数中的操作符和邻近操作符之间产生歧义;
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值