C语言进阶---程序环境和预处理

news2024/10/2 10:43:36

C语言进阶---程序环境和预处理

  • 前言
  • 一、程序的翻译环境、执行环境
  • 二、详解:C语言程序的编译+链接
  • 三、预定义符号介绍
  • 四、预处理指令 #define
  • 五、宏和函数的对比(思维导图)
  • 六、命令定义、预处理指令 #include #undef
    • 1.命名约定
    • 2.命令行定义
  • 七、条件编译

前言

那么好了好了,宝子们,从今天开始开始总结暑假博客,今天的主角:程序环境和预处理,来吧开始整活!⛳️

一、程序的翻译环境、执行环境

在ANSI C的任何一种实现中,存在两个不同的环境。

第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境,它用于实际执行代码。

二、详解:C语言程序的编译+链接

在这里插入图片描述

  • 组成一个程序的每个源文件通过编译过程分别转换成目标代码(object code)。
  • 每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。
  • 链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。

编译本身也分为几个阶段:
看代码:

#include <stdio.h>
//sum.c
int g_val = 2016;
void print(const char* str)
{
	printf("%s\n", str);
}
//test.c
int main()
{
	extern void print(char* str);
	extern int g_val;
	printf("%d\n", g_val);
	print("hello bit.\n");
	return 0;
}

在这里插入图片描述
这是预处理期间发生的:

#include <stdio.h>
int main()
{
 int i = 0;
 for(i=0; i<10; i++)
 {
 printf("%d ", i);
 }
 return 0;
}

  1. 预处理 选项 gcc -E test.c -o test.i 预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中。
  2. 编译 选项 gcc -S test.c 编译完成之后就停下来,结果保存在test.s中。
  3. 汇编 gcc -c test.c 汇编完成之后就停下来,结果保存在test.o中。

VIM学习资料
简明VIM练级攻略:
简明VIM练级攻略链接:https://coolshell.cn/articles/5426.html
给程序员的VIM速查卡
给程序员的VIM速查卡:https://coolshell.cn/articles/5479.html

  1. 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
  2. 程序的执行便开始。接着便调用main函数。
  3. 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。
  4. 终止程序。正常终止main函数;也有可能是意外终止。

三、预定义符号介绍

预定义符号:
在这里插入图片描述

四、预处理指令 #define

#define
#define 定义标识符:

#define MAX 1000
#define reg register          //为 register这个关键字,创建一个简短的名字
#define do_forever for(;;)     //用更形象的符号来替换一种实现
#define CASE break;case        //在写case语句的时候自动把 break写上。
// 如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。
#define DEBUG_PRINT printf("file:%s\tline:%d\t \
                          date:%s\ttime:%s\n" ,\
                          __FILE__,__LINE__ ,       \
                          __DATE__,__TIME__ )

在define定义标识符的时候,要不要在最后加上 ; ?
nononono
比如:

#define MAX 1000;//错误,不建议这样写
#define MAX 1000

提示:(只要对于宏定义的来说,多加括号就完事了,肯定不会出错。)
所有用于对数值表达式进行求值的宏定义都应该用这种方式加上括号,避免在使用宏时由于参数中的操作符或邻近操作符之间不可预料的相互作用!
#define 替换规则:
在程序中扩展#define定义符号和宏时,需要涉及几个步骤。

  1. 在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先被替换。
  2. 替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值替换。
  3. 最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上述处理过程。

注意:

  1. 宏参数和#define 定义中可以出现其他#define定义的变量。但是对于宏,不能出现递归。
  2. 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。

五、宏和函数的对比(思维导图)

在这里插入图片描述

六、命令定义、预处理指令 #include #undef

1.命名约定

一般来讲函数的宏的使用语法很相似。所以语言本身没法帮我们区分二者。 那我们平时的一个习惯是:

把宏名全部大写 函数名不要全部大写

#undef
这条指令用于移除一个宏定义。
#undef NAME
//如果现存的一个名字需要被重新定义,那么它的旧名字首先要被移除

2.命令行定义

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

#include <stdio.h> 
int main() 
{ 
 int array [ARRAY_SIZE]; 
 int i = 0; 
 for(i = 0; i< ARRAY_SIZE; i ++) 
 { 
 array[i] = i; 
 } 
 for(i = 0; i< ARRAY_SIZE; i ++) 
 { 
 printf("%d " ,array[i]); 
 } 
 printf("\n" ); 
 return 0; 
}

七、条件编译

在编译一个程序的时候我们如果要将一条语句(一组语句)编译或者放弃是很方便的。因为我们有条件编译指令。

调试性的代码,删除可惜,保留又碍事,所以我们可以选择性的编译。

注: 推荐《高质量C/C++编程指南》中附录的考试试卷(很重要)。
笔试题:

  1. 头文件中的 ifndef/define/endif是干什么用的?
  2. #include <filename.h> 和 #include "filename.h"有什么区别?
    其他预处理指令
    #error
    #pragma
    #line

    不做介绍,自己去了解。
    #pragma pack()在结构体部分介绍。
    参考《C语言深度解剖》学习

好了,今天的分享就到这里了
如果对你有帮助,记得点赞👍+关注哦!
我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1072206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

撤销git本地修改(万能)

使用 git reflog 和 git reset 命令。 git reflog 命令可以查看 Git 中所有的提交历史和分支移动情况&#xff0c;包括已经删除的提交。 您可以通过这个命令找到git操作时间线上的某一个节点&#xff0c;也就是git提交快照的Hash值。 假设您要回滚的提交的哈希值是 e9769f5…

轻松实现时间录入自由!如何在Microsoft Word中轻松插入格式化的日期和时间

在文档中插入当前日期和时间有几个原因。你可能希望将其插入信函或页眉或页脚中。无论是什么原因&#xff0c;Word都可以轻松地将日期和时间插入文档。 如果希望在打开或打印文档时自动更新日期和时间&#xff0c;可以将其作为自动更新的字段插入。该字段也可以随时手动更新。…

【虚拟机】桥接模式下访问外网

目录 一、桥接模式的作用原理 二、配置桥接模式实现外网访问 1、设置 VMnet0 要桥接的网卡 2、虚拟机选择 VMnet0 网卡 3、手动配置虚拟机IP 一、桥接模式的作用原理 桥接模式相当于在当前局域网里创立了一个单独的主机&#xff0c;该主机桥接到宿主主机的网卡&#xff0…

TPU编程竞赛|Stable Diffusion大模型巅峰对决,第五届全球校园人工智能算法精英赛正式启动!

目录 赛题介绍 赛题背景 赛题任务 赛程安排 评分机制 奖项设置 近日&#xff0c;2023第五届全球校园人工智能算法精英赛正式开启报名。作为赛题合作方&#xff0c;算丰承办了“算法专项赛”赛道&#xff0c;提供赛题「面向Stable Diffusion的图像提示语优化」&#xff0c…

ORB-SLAM2运行自己的数据集进行定位教程

ORB-SLAM2只做定位的话&#xff0c;精度还是挺准确的&#xff0c;所以用单目摄像头录制视频&#xff0c;制作自己的数据集跑一下&#xff0c;看看定位精度&#xff0c;将过程加以记录。 文章目录 一、系统配置二、制作数据集1、脚本编写2、配置文件编写3、录制视频素材&#x…

亚马逊、速卖通卖家旺季攻略:抢占旺季销售先机!

随着11月的到来&#xff0c;海外跨境电商又将迎来一年中最重要的营销季节。 11月营销节点 1. 黑色星期五&#xff08;Black Friday&#xff09;&#xff1a;11月的第四个星期五 作为西方传统节日&#xff0c;黑色星期五通常位于11月第四个星期五&#xff0c;是购物狂欢的黄金…

LeetCode刷题笔记【35】:动态规划专题-7(爬楼梯、零钱兑换、完全平方数)

文章目录 前置知识70. 爬楼梯 &#xff08;进阶&#xff09;题目描述解题思路代码 322. 零钱兑换题目描述解题思路代码 279.完全平方数题目描述解题思路代码 总结 前置知识 今天的三道题都聚焦完全背包问题, 关于完全背包, 基础性的思路可以参考上一篇文章 本文的很多操作就是…

4.Docker 搭建 redis6

1.下载redis docker pull redis:6.2.62.创建需要挂载的宿主机文件夹 mkdir -p /data/redis/conf mkdir -p /data/redis/data3.配置redis 切换到/data/redis/conf文件夹下&#xff0c;创建redis.conf,复制redis.conf配置文件内容到redis.conf文件中&#xff0c;然后按下键盘 …

多层包的java程序使用命令行编译、运行、打包

对于没有包层级的java程序&#xff0c;用命令行进行编译、运行、打包很简单。对于多层级包的java程序会有所不同。以如下程序为例 package HeadFirstJava.chapter01.guessGame;public class GameLanucher {public static void main(String[] args) {GuessGame game new Guess…

CentOS停服遭替代,这些操作差异,你了解了吗?

背景 随着 CentOS停服&#xff0c;各个行业的运维都在寻找各自的替代方案&#xff0c;考虑的出发点有&#xff1a; 新操作系统是否兼容CentOS&#xff0c;避免太大的操作差异&#xff1b; 新操作系统是否为信创&#xff0c;其具体收费情况如何&#xff1b; 新操作系统是否支…

亚马逊电子产品日本站PSE认证,TELEC认证如何办理?

日本市场准入认证——PSE认证&#xff0c;TELEC认证 日本作为第三大经济体国家&#xff0c;是中国商品对外出口的最多的国家之一&#xff0c;无论是在日本亚马逊销售还是在日本当地销售&#xff0c;都需要符合日本市场准入许可。需要注意的是日本的电气安全标准都是自主特色的…

2023最新站长必备在线工具箱系统源码优化修复版

2023最新站长必备在线工具箱系统源码 含上百款工具 带后台版本 自适应模板 优化修复版 搭建看了一下,系统一切正常可用,就是后台登录方式使用的是QQ扫码登录的,建议有能力的可以改一改 此工具箱系统源码还是比较成熟的&#xff0c;虽然没有那么花里胡哨&#xff0c;但贵在简洁大…

软件项目管理【第一章:软件项目管理概述/项目启动】

目录 一、软件项目管理概述 1.项目 2.项目管理 3.项目管理框架 3.整个软件项目管理概述 二、项目启动 1.项目类型 2.初始化项目分析 3.生存期模型(常用) 4.项目立项 一、软件项目管理概述 1.项目 项目的定义&#xff1a; 是为了创造一个唯一的产品或提供一个唯一的…

N9030B是德科技信号分析仪

181/2461/8938它能够实现对复杂信号的实时捕获、分析和处理。Keysight N9030B采用了最先进的技术和设计&#xff0c;为工程师和科学家们提供了一系列强大的功能&#xff0c;帮助他们更好地进行信号分析&#xff0c;以满足不断变化的应用需求。 Keysight N9030B采用了全新的硬件…

TensorFlow入门(十二、分布式训练)

1、按照并行方式来分 ①模型并行 假设我们有n张GPU,不同的GPU被输入相同的数据,运行同一个模型的不同部分。 在实际训练过程中,如果遇到模型非常庞大,一张GPU不够存储的情况,可以使用模型并行的分布式训练,把模型的不同部分交给不同的GPU负责。这种方式存在一定的弊端:①这种方…

COM组件IDispatch操作

IDispatch 组件接口&#xff0c;继承IUnkown&#xff0c;实现了反射机制&#xff0c;可以通过invoke调用dll函数 一般执行过程需要GetIDsOfNames、InvokeHelper函数执行&#xff0c;queryinterface查询获取对象 检查GetIDsOfNames返回的dispid是否正确 COleDispatchDriver 单…

Windows搭建FTP服务器

以win10为例&#xff1a; 安装FTP服务器支持和IIS管理平台。 设置->应用->程序与功能->启用或关闭windows功能-> Internet Infomation Services->勾选【FTP服务器】和Web管理工具的【IIS管理控制台】-> 点击确定等待安装完成。 打开IIS管理器 此电脑-右键…

微信小程序使用CryptoJS加密PassWord(MD5)

微信小程序使用CryptoJS加密PassWord(MD5) 背景及环境&#xff1a; 微信小程序登录页面&#xff0c;需要加密登录密码发送给后端&#xff0c;使用 MD5 来加密密码 开发工具&#xff1a;微信开发者工具 npm安装CryptoJS 查看有哪些crypto的包 npm search crypto 找到自己需要的包…

【AI】将图片制作成可编辑的图标

需要工具&#xff1a;QQ截图、AI描摹 图标网站&#xff1a;有用的网站收藏夹_h5动漫引擎-CSDN博客 第一&#xff1a;随便找个图标网站&#xff0c;选中自己需要的图标【付费的也可以】【肯定是图标越大越清晰】【此处做示范没用最大的图标】&#xff0c;用QQ截图&#xff08;…

微信小程序:实现列表单选

效果 代码 wxml <view class"all"><view class"item_all" wx:for"{{info}}" wx:key"index"><view classposition {{item.checked?"checked_parameter":""}} data-id"{{item.employee_num}}…