预编译指令#define、#include、标准头文件结构小析

本文深入解析C语言中的宏定义、编译预处理指令及其实现原理,包括#define指令的使用、宏的展开、条件编译、预定义宏及带参数的宏。同时,介绍了编译单元、项目构建过程、#include指令的作用与形式,以及如何避免头文件重复包含等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. #define编译预处理指令

	a. #define <名字> <值>
	b. 没有结尾的分号,因为不是C的语句
	c. 名字必须要有一个是单词,值可以是各种东西
	d. C语言中的编译器开始之前,编译预处理程序会把程序中的名字改为值(宏展开)
		i. 完全的文本替换
	e. 宏
		i. 如果一个宏的值里面有其他的宏的名字,也是会宏展开的
		ii. 如果一个宏的值超过一行,最后一行之前的行末要加反斜杠\
	f. 没有值的宏
		i. #define _DEBUG
		ii. 这类宏是用于条件编译的,后面有其他的编译预处理指令来检查这个宏是否已经被定义过
	g. 预定义的宏
		i. 这些宏在C程序中,不需要再进行定义,可以直接使用
		ii. _STDC_、_LINE_、_FILE_、_DATE_、_TIME_
	h. 带参数的宏(像函数)
		i. #define cube(x) ((x)*(x)*(x))
		ii. 在C语言中,用绿色部分替换黄色部分
		iii. 注意:为避免计算错误,需要将绿色部分用大括号括起来
			1) 参数出现的地方需要括号
			2) 整个值也需要括号
		iv. 带多个参数的宏
			1)  #define  MIN(a,b)  ((a)>(b)?(b):(a))

2. 一个.c文件是一个编译单元

	a. 编译器每次编译只处理一个编译单元--->生成.o文件
	b. 很多个.c文件都被编译完成之后,由LINK将.o文件链接成一个可执行文件.exe

3. 项目:

	a. Dev C++中新建一个项目,然后把几个源代码文件添加进入即可
	b. 对于项目。Dev C++的编译会把一个项目中所有的源代码文件都编译然后链接
	c. 对于VS, 是编译按钮只进行编译。然后build进行构建对整个项目做链接

4. #include

	a. #include是一个编译预处理指令,和宏一样,在编译之前就预处理了
	b. 功能是把那个文件的全部内容原封不动地插入到他所在的地方
	c. 所以并不是所有的.c文件都需要#include
	d. #include有两种形式指出要插入的.h头文件
		i. “”---表示要求编译器首先在当前目录寻找.h文件;如果没有那么到编译器指定的目录去寻找
		ii. < >---表示要求编译器直接到编译器指定的目录寻找.h头文件
		iii. #include并不是用来引入函数库的,引入函数库的工作是编译器干的;因此#include引入.h文件主要是用于引入所需要的函数的原型
		iv. 库函数的原码在.lib文件中
	e. 头文件
		i. 在使用和定义这个函数的地方都应该#include这个头文件
		ii. 这个头文件一般存放所有的对外公开的函数的原型和外部链接的静态变量
	f. 重复声明
		i. 在同一个编译单元里,同名的结构不可以被重复声明
		ii. 如果在头文件里面有结构的声明,那么很难这个头文件不会在一个编译单元里被#include多次
		iii. 所以需要“标准头文件结构”来避免重复声明结构
			1) 标准头文件
			2) 如下图所示 
			3) 其中的意思就是,先判断如果_LIST_HEAD_未定义,那么进行定义;否则直接跳过
			4) 运用了条件编译和宏,保证这个头文件在一个编译单元中只会被#include一次
			5) #pragma once也能起到相同的作用,但不是所有的编译器都会支持

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖啡与乌龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值