当前位置: 首页 > news >正文

C语言——预处理

C语言编译步骤

预处理

编译

汇编

链接

预处理

概念:

        预处理就是在源文件(如.c文件)编译之前,所进行的一部分预备操作,这部分操作是由预处理程序自动来完成;当源文件在编译时,编译器会自动调用预处理程序来完成对预处理指令的解析,预处理指令解析完成才能进入下一步的编译过程。

        我们为了能够方便的看到这个编译细节,我们可以使用下面命令:

gcc 源文件 -E -o 程序名[.后缀]

预处理的功能

宏定义

不带参数的宏定义

语法:

#define 宏名 常量数据

预处理:

此时的预处理只做数据替换,不做类型检查

注意:

我们定义的宏是不会占用内存空间,还没有到编译环节,就已经被替换成了我们宏中的常量数据

带参数的宏定义

语法:

#define 宏名(参数列表) 参数表达式

面试题:

#define multi(a,b) a * b
/*** 宏定义-带参数*/
#include <stdio.h>#define MULTI(a,b) a * bint main()
{int result = MULTI(7+2,3);printf("%d\n",result);// 13 return 0;
}

宏定义的作用域

#define 命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常,#define命令写在文件开头,函数之前,作为文件一部分,在此文件范围内有效。

可以用 #undef 命令终止宏定义的作用域

文件包含

概念:

所谓“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来。这个适用于多文件开发。

预处理

此时的预处理,是将文件中的内容替换,文件包含指令。

包含方式:

第1种:

#include<xxxx.h>

系统会到标准库头文件目录(Linux下/usr/include )查找包含的文件

第2种:

#include"xxxx.h"

在当前工程路径下查找,如果未找到,系统会到标准库头文件目录查找

案例:

algorithm.h

/**

 * 自定义头文件,专门用于存放被外部访问的函数的声明

*/

// 数组的累加和计算

extern int sum(const int *p,int len);

algorithm.c

/**

 * 实现数组元素的累加计算

 */

int sum(const int *p,int len)

{

 int sum = 0;

 register int i = 0;

 for(;i len; i++)

 {

 sum += *(p+i);

 }

 return sum;

}

app.c

// #include

// 引入自定义的头文件

#include "algorithm.h"

// 如果有n多个外部函数,难道都要一个个的使用extern进行声明?

// 引入外部函数声明

// extern int sum(const int*,int);

int main()

{

 int arr[5] = {12,33,14,55,34};

 int res = sum(arr,5);

printf("数组累和结果是:%d\n",res);

return 0;

}

编译命令:

gcc algorithm.c app.c -o app // 有包含关系的c文件要一起编译

条件编译

概念

根据设定的条件选择待编译的语句代码。

预处理

将满足条件的语句进行保留,不满足条件的语句进行删除,交给下一步编译

语法:

语法一:

#ifdef 标识——判断标识没有定义执行ifdef语句,定义执行else

...

#else

...

#endif

语法二:

#ifndef 标识——判断标识没有定义执行ifdef语句,定义执行else

...

else

...

#endif

语法三:

#if 表达式——根据表达式返回的结果:0不成立(执行else语句),1成立(执行if语句)

...

#else

...

#endif

避免头文件重复包含的方法

语法:

#ifndef __XXXX_H

#define __XXXX_H

 ...

#endif

案例:

algorithm.h

/**

 * 自定义头文件,专门用于存放被外部访问的函数的声明

 */

#ifndef __ALGORITHM_H

#define __ALGORITHM_H

// 数组的累加和计算

extern int sum(const int *p,int len);

#endif

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【速览】设计模式(更新中)
  • 【Linux】软硬链接
  • 0.91寸OLED迷你音频频谱
  • 乘积小于 K 的子数组(LeetCode)
  • 软件工程(2)面向对象方法:Booch方法与开发实例
  • 机器学习笔记六-朴素贝叶斯
  • 【机器学习】探索机器学习在旅游业的革新之旅
  • BI分析实操案例分享:零售企业如何利用BI工具对销售数据进行分析?
  • 后端代码练习5--验证码案例
  • 算法的学习笔记—栈的压入、弹出序列(牛客JZ31)
  • 【人工智能】对智元机器人发布的远征A1所应用的AI前沿技术进行详细分析,基于此整理一份学习教程。
  • 每天一个数据分析题(四百九十)- 主成分分析与因子分析
  • 基于SpringBoot的Java个人博客系统的设计与实现(源码+lw+部署文档+讲解等)
  • 【论文阅读】APMSA: Adversarial Perturbation Against Model Stealing Attacks(2023)
  • Few-shot Learning
  • 《剑指offer》分解让复杂问题更简单
  • 【Leetcode】104. 二叉树的最大深度
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 08.Android之View事件问题
  • C++类的相互关联
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • ECS应用管理最佳实践
  • GitUp, 你不可错过的秀外慧中的git工具
  • HashMap剖析之内部结构
  • in typeof instanceof ===这些运算符有什么作用
  • MobX
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 聚类分析——Kmeans
  • 码农张的Bug人生 - 见面之礼
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 盘点那些不知名却常用的 Git 操作
  • 前端设计模式
  • 如何在 Tornado 中实现 Middleware
  • 事件委托的小应用
  • 在Unity中实现一个简单的消息管理器
  • 责任链模式的两种实现
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #QT 笔记一
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #数据结构 笔记三
  • #微信小程序(布局、渲染层基础知识)
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (LeetCode) T14. Longest Common Prefix
  • (pytorch进阶之路)扩散概率模型
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)ssm码农论坛 毕业设计 231126
  • (附源码)计算机毕业设计SSM教师教学质量评价系统