程序环境和预处理(含C语言程序的编译+链接)--2

文章前言:

上章我们把 程序的翻译环境 程序的执行环境 C语言程序的编译+链接 预定义符号介绍 预处理指令 #define 宏和函数的对比 预处理操作符 #和##的介绍 的相关知识进行了梳理讲解,接下来被把剩余知识 命令定义 预处理指令 #include 预处理指令 #undef 条件编译 的相关知识梳理讲解!

🎉个人名片:

🐼作者简介:一名乐于分享在学习道路上收获的大二在校生

🐻‍❄个人主页🎉:GOTXX

🐼个人WeChat:ILXOXVJE

🐼本文由GOTXX原创,首发CSDN🎉🎉🎉

🕊系列专栏:零基础学习C语言----- 数据结构的学习之路

🐓每日一句:如果没有特别幸运,那就请特别努力!🎉🎉🎉


🎉文章简介:

本篇文章对 程序环境和预处理详解(含C语言程序的编译+链接) 的相关知识详细讲解!

如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作动力的源泉,让我们一起加油,一起奔跑,让我们顶峰相见!!!🎉🎉🎉

续:

3.3 #undef

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

举个栗子:

当我们加上#define MAX后再打印

加了#define MAX 后,MAX宏被移除

3.4****命令行定义

许多C 的编译器提供了一种能力,允许在命令行中定义符号。用于启动编译过程。
例如:当我们根据同一个源文件要编译出一个程序的不同版本的时候,这个特性有点用处。(假定某个 程序中声明了一个某个长度的数组,如果机器内存有限,我们需要一个很小的数组,但是另外一个机器 内存大些,我们需要一个数组能够大些)

举个栗子:(//linux 环境演示)

当我们写下一个这样的代码时:

编译指令:

gcc test.c -D SE=10 -o test
通过-D的选项来指定SZ的值是多少,这样再编译的时候,可以改变SZ的大小,即数组大小

3.5****条件编译

在编译一个程序的时候我们如果要将一条语句(一组语句)编译或者放弃是很方便的,因为
我们有条件 编译指令
即我们可以设置一个条件,如果条件满足就编译,不满足就不编译;

常见的条件编译指令:

第一种:


举个栗子:

解析:

运行结果:当M==1时

当M!=1时:

#if #endif 与 if 语句的区别:

if语句时条件不满足不执行该代码,不会在预处理阶段删除,

而#if语句,条件不满足时会在预编译阶段将该语句删除;

第二种:

举个栗子:

运行结果:

第三种:

举个栗子:

运行结果:

第四种:

3.6****文件包含

我们已经知道, #include 指令可以使另外一个文件被编译。就像它实际出现于 #include 指令的地方 一样

这种替换的方式很简单:
预处理器先删除这条指令,并用包含文件的内容替换
这样一个源文件被包含10次,那就实际被编译10次

3.6.1****头文件被包含的方式:

第一种:本地文件包含

查找策略:
先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件一样在标
准位置查找头文件如果找不到就提示编译错误

第二种:库文件包含

查找头文件直接去标准路径下去查找,如果找不到就提示编译错误
库函数的包含也可以用双引号

3.6.2****嵌套文件包含

如果出现这样的场景:

comm.h和comm.c是公共模块
test1.h和test1.c使用了公共模块
test2.h和test2.c使用了公共模块
test.h和test.c使用了test1模块和test2模块
这样最终程序中就会出现两份comm.h的内容
这样就造成了文件内容的重复

避免头文件的重复引入的方法

第一种:

条件编译:

每个头文件的开头写

#ifndef TEST_H
#define TEST_H
// 头文件的内容
#endif //TEST_H
第二种:
写开头:
#pragma once

本章完~


相关推荐
23471021278 分钟前
4.15 学习笔记
开发语言·软件测试·python
零号全栈寒江独钓9 分钟前
基于c/c++实现linux/windows跨平台获取ntp网络时间戳
linux·c语言·c++·windows
CSCN新手听安21 分钟前
【linux】高级IO,以ET模式运行的epoll版本的TCP服务器实现reactor反应堆
linux·运维·服务器·c++·高级io·epoll·reactor反应堆
java1234_小锋33 分钟前
Java高频面试题:什么是可重入锁?
java·开发语言
雾岛听蓝1 小时前
Qt操作指南:窗口组成与菜单栏
开发语言·经验分享·笔记·qt
zopple2 小时前
Laravel vs ThinkPHP:PHP框架终极对决
开发语言·php·laravel
松☆2 小时前
C++ 算法竞赛题解:P13569 [CCPC 2024 重庆站] osu!mania —— 浮点数精度陷阱与 `eps` 的深度解析
开发语言·c++·算法
耿雨飞2 小时前
Python 后端开发技术博客专栏 | 第 06 篇 描述符与属性管理 -- 理解 Python 属性访问的底层机制
开发语言·python
耿雨飞2 小时前
Python 后端开发技术博客专栏 | 第 08 篇 上下文管理器与类型系统 -- 资源管理与代码健壮性
开发语言·python
(Charon)2 小时前
【C++/Qt】C++/Qt 实现 TCP Server:支持启动监听、消息收发、日志保存
c++·qt·tcp/ip