预处理详解

简介: 预处理详解

1、预定义符号


C语言设置了一些预定义符号,可以在预处理阶段直接使用:


1 __FILE__  //进行编译的源文件

2 __LINE__ //文件当前的行号

3 __DATE__ //文件被编译的日期

4 __TIME__ //文件被编译的时间

5 __STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义


比如:



2、#define定义常量


这个比较简单,和我们的用法差不多,


#define MAX 100

#define REG register

当我们定义的语句比较长,可以分成多行来写,比如:


#define DEBUG_PRINT printf("file:%s\tline:%d\t \
                           date:%s\ttime:%s\n" ,\
                           __FILE__,__LINE__ , \
                           __DATE__,__TIME__ )

在每行的末尾处加上反斜杠 \ ,也叫续行符,最后一行不用加

在定义#define时,最后不用加 ; 容易出现语法错误,

3、#define定义宏


#define机制包括了一个规定,允许把参数替换到文本中,这种实现通常成为宏或者定义宏

宏的声明方式:


#define  name( parament-list )  stuff


其中parament-list是一个由逗号隔开的符号表,他们可能出现在stuff中,

注意:


参数列表的左括号必须与name紧邻,如果两者之间有任何空⽩存在,参数列表就会被解释为stuff的⼀部分。


例如:



注意,#define只是完成了替换,这时候又一个问题出现了,运算符优先级问题.比如:



为了避免这种问题,我们要对每个x加上 (),这样就解决问题了,可能比较麻烦

#define SQUARE(x) ((x)*(x))


这样写是最安全的,可以避免由于运算符优先级出现的问题


4、带有副作用的宏参数


当宏参数在宏的定义中出现超过一次的时候的时候,如果宏参数带有副作用,那么在使用这个宏的时候就会出现一些不好的后果,副作⽤就是表达式求值的时候出现的永久性效果。


x+1  //没有副作用

x++  //有副作用

比如:



这是不带副作用的情况下,a和b的值都不变



这时候我们要注意,尽量避免这样写

5、宏的替换规则


1.在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号,如果是,他们先替换

2.替换文本被插入到程序中原来的位置中,这些都是在预处理阶段就完成的

3.最后,再次对文件进行扫描,看看是否还有包含#define定义的符号,如果是,就重复上述步骤;


注意:


1.宏参数和宏定义中可以出现其他宏定义的符号,但是不能出现递归;

2.当预处理器搜索#define定义的符号时,字符串常量的内容并不被搜索;

比如:



字符串中的M并不被搜索


6、宏和函数的对比


了解一下7、


7、#和##


#运算符将宏的一个参数转换成字符串字面量,他仅允许出现在带参数的替换列表中

#运算符执行的操作可以理解为“字符串化”

比如:



##运算符可以把位于他两边的符号合成一个符号,##被称为记号粘合,对于这个东西用的少,能看懂被人用的什么意思就好

比如:



看看就好,用的不多

8、命名约定


平常的习惯是宏名全部大写

函数名不要全部大写


9、#undef


这条指令用于移除一个宏定义



#undef NAME

//如果现存的⼀个名字需要被重新定义,那么它的旧名字⾸先要被移除。


比如:



我们要修改M的值,要先移除这个宏,然后再重新定义;

10、条件编译


在编译一个程序的时候我们如果要将一条语句编译或者放弃的时候,可以用条件编译指令


比如:

常见的条件编译指令:

1.单分支的条件编译

#if    常量表达式    //如果表达式语句为真,则执行#if里面的语句,否则不执行

//语句

#endif


2.多分支的条件编译:


#if        常量表达式

//语句

#elif     常量表达式

//语句

#elif     常量表达式

//语句

#else

//语句

#endif

比如:



只有第一个表达式为真,所以只执行第一条语句,如果有多个表达式都为真, 则只执行最先为真的那一个表达式


3.判断是否被定义


#ifdef 宏常量

//语句

#endif

他还·等价于

#if defined(宏常量)

//语句

#ednif

如果宏常量被定义,那么就执行条件里面的语句,否则不执行,比如:



红框框里的两条语句时等价的;

如果__DEBUG__被定义,则执行语句,否则不执行

4.嵌套指令


#if defined(OS_UNIX)

       #ifdef OPTION1

              unix_version_option1()

       #endif

       #ifdef OPTION2
              unix_version_option2();
       #endif
#elif defined(OS_MSDOS)                                                                                                                #ifdef OPTION2
                msdos_version_option2();
         #endif

#endif

11、头文件的包含方式


本地文件包含:


#include"filename.h"

先在源文件所在目录下查找,如果找不到,就在标准库头文件里面查找,如果还找不到,就提示编译错误;

库文件包含:


#include<stdio.h>

查找库函数头文件直接在标准库里面去查找,如果找不到就提示编译错误

如果是这样,那么标准库头文件也可以用“ ” 来包含?

是这样的,但是这样查找效率低下,而且也不容易区分是库文件还是本地文件

12、嵌套文件包含

我们已经知道#include指令可以使另一个文件被编译,就是在#include这行指令处展开被编译的文件,但是如果我们重复包含,对编译的压力就会比较大,运行起来比较慢

如何解决头文件被重复包含的问题?

条件编译

在每个头文件的开头写:


  #ifndef  __TEST_H__

  #define __TEST_H__

  //语句

  #endif

意思是:


如果 __TEST_H__  没有被定义,那么  #define __TEST_H__  定义,然后执行头文件的内容,


如果包含的有相同的头文件,先判断   #ifndef  __TEST_H__  发现  __TEST_H__  被定义了,那么不再执行头文件中的内容;


另外还有一种更加方便的写法:


#pragma once


作用和上面是一样的,都是防止头文件被重复包含。

相关文章
|
3天前
|
人工智能 自然语言处理 安全
阿里云AI数智鉴密:AI 生成内容如何拿到一张"防篡改的身份证"
隐形水印 + C2PA签名:让AI生成内容“持证上岗”。
1111 0
|
12天前
|
人工智能 自然语言处理 安全
阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考
本文聚焦阿里云2026年推出的三款自研AI办公产品,清晰拆解千问办公、Qoder Teams、Qoder CN的差异化定位与能力边界:千问办公主打职场全场景提效,支持自然语言指令一键完成PPT生成、数据分析等高频办公任务;Qoder Teams面向程序员团队,深度整合AI代码生成、团队协同与企业知识库能力;Qoder CN则专为金融、政务等强合规场景打造,实现数据不出境与VPC私有化部署。文章同步给出分场景选型指南与最新活动定价,帮助不同类型的企业按需组合产品,实现业务岗、研发岗与强合规场景的AI能力全覆盖。
3708 4
阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考
|
24天前
|
人工智能 缓存 前端开发
DeepSeek Harness 首发实测 + 入门教程,夯爆了!梁神我错了
DeepSeek Harness + DeepSeek V4 Pro 项目实战保姆级教程!手把手带你从零安装开源 AI 编程工具,开发架构图、知识讲解网站、3D 网页游戏、全栈 AI 应用 4 个项目,覆盖运行模式选择、插件安装与开发,看看能不能对标 Claude。
13511 93
DeepSeek Harness 首发实测 + 入门教程,夯爆了!梁神我错了
|
17天前
|
Web App开发 人工智能 API
16 个超火的 DeepSeek Harness 插件,大肥鱼已经落后 N 个版本了。。。
DeepSeek Harness 精选插件推荐合集,从图片识别、浏览器操控、多 Agent 协作到手机远程控制,一口气带你看完 DSH 社区热门的十几个插件,覆盖技能扩展、UI 界面增强、整活玩法三大类,让你的鲸鱼变得更强。
1974 5
|
3天前
|
人工智能 运维 BI
阿里云千问办公QwenWork深度解析:基于Qwen3.8,六大核心能力重构企业全自动化工作流与计费选型指南
传统AI办公工具大多停留在对话问答、文档摘要、简单文案生成层面,只能完成单点碎片化任务,无法自主拆解复杂业务流程,很难串联多工具、多文档、外部业务系统完成端到端完整工作交付。很多企业在落地AI办公的时候,需要组合多款不同工具,来回切换界面,手动复制粘贴中间结果,智能化改造落地门槛居高不下。千问办公QwenWork是整合多款智能体产品能力打造的一体化企业办公智能体平台,底层基座依托Qwen3.8大模型,打通桌面端Agent、云端Agent、企业协同Agent三种运行形态,不再局限简单问答,接收业务目标之后自主拆解任务步骤,调用各类工具,处理文档、表格、浏览器自动化、数据查询,直接输出可交付的办公
1027 0
|
13天前
|
人工智能 Linux iOS开发
Ollama使用教程:Ollama官网下载、Ollama本地部署大模型(2026最新)
Ollama 是一款免费开源的本地大模型运行工具,支持在 Windows/macOS/Linux 上离线运行 Qwen、DeepSeek、Llama 等主流开源模型,数据不出本机、隐私安全。提供 OpenAI 兼容 API,命令行一键拉取/运行/管理模型,无需联网,无调用限制,是开发者与 AI 爱好者部署本地 AI 助手的理想选择。(239 字)
|
9天前
|
人工智能 并行计算 数据可视化
秋叶ComfyUI-AKI最新整合包|完整部署教程+核心指令手册
秋叶ComfyUI-AKI一键整合包,国内适配最优、稳定性最强的商用/学习级版本:全封装虚拟环境、预装90%常用节点、内置绘世启动器与成熟工作流,免配置、零依赖、解压即用,完美兼顾新手入门与专业批量生产需求。(239字)
|
10天前
|
人工智能 监控 测试技术
Qwen3.8-Flash 来了,100万上下文、Agent、Coding 都加强了
8月26日,通义千问发布Qwen3.8-Flash-Next:125B参数、每Token仅激活6B,原生支持26万Token、可扩展至100万上下文;Coding、Agent与工具调用能力显著增强,面向真实软件工程任务,推动大模型从“回答问题”迈向“完成工作”。

热门文章

最新文章