【C语言】程序环境和预处理

程序环境:

1、C语言的任何一种实现,存在两个不同的环境;

2、翻译环境:将源代码转换成可执行的二进制指令(机器指令);.c文件(源文件——文本信息的代码)->(翻译环境)->.exe文件(可执行文件);

2、运行环境:实现可执行文件,执行到我们想要的结果;


翻译环境:

1、编译:

定义:

依赖于编译器(vs中的编译器叫做:cl.exe),编译器只有一个;源文件通过编译器编译生成目标文件(目标文件已经是二进制的了);

1、预编译(预处理):

进行文本操作的处理(增、删、改),还是我们所写的C语言代码,生成.i文件;

  • 将代码中的注释替换成了空格;
  • 头文件的包含;
  • #开头的都是预处理指令,所有的预处理指令都是在预处理阶段处理的;
2、编译:

把C语言代码翻译成了汇编代码,生成.s文件;

  • 词法分析;语法分析;语义分析;符号汇总(专业术语);
3、汇编:

将汇编代码翻译成二进制指令,生成目标文件;

  • 生成符号表;

2、链接:

定义:

依赖于连接器(vs中的链接器叫做:link.exe),链接库和目标文件通过连接器形成可执行文件/程序;多个目标文件可以一起链接;

目标文件:windows环境下的目标文件后缀是:.obj;Linux环境下生成的目标文件后缀是:.o;

链接:

链接目标文件和链接库生成可执行程序(二进制的程序);

  • 合并段表;
  • 符号表的合并和重定位;

 运行环境:

1、程序必须载入到内存中,一般在有操作系统的环境下完成;

2、找到main函数开始运行;

3、开始执行程序代码,使用一个运行时堆栈(函数栈帧空间),存储函数的局部变量和返回地址。程序还可以使用静态内存、存储在静态内存中的变量,在程序执行过程中一直保留这些静态变量的值;

4、终止程序,结束main函数的运行;


 图示编译链接:


 书本推荐:

程序员的自我修养


预处理

预定义符号:

__FILE__ // 当前编译的文件

__LINE__// 当前编译的行号

__DATE__// 当前编译的日期

__TIME__// 当前编译的时间

__FUNCTION__// 当前编译的函数


#define定义标识符

1、定义的标识符只会替换,不会进行计算;

2、#define定义的标识符在预处理阶段,这些标识符将会被替换;

3、#dedine定义的内容可以是多种多样的;

4、#define定义符号的最后不加分号,因为在替换的时候,如果加了分号后会把分号也替换进去;


 #define定义宏

1、允许把参数替换到文本中;

2、看代码会更容易理解;

// #define定义宏
#define a(n) (4 + 2)*(n)
// 参数括号必须紧挨a,如果加了空格隔开,将会当做替换部分;
// 需要将括号加上;
int main()
{int z = 0;z = 2 * (2 + a(4 + 1)); // a(4 + 1) -> a(5)// 2 * (2 + 6 * 5) = 64return 0;
}

 #define替换规则

1、在调用宏时,先对参数进行检查,包含任何由#define定义的符号则首先被替换。

2、将宏定义的替换文本插入到原来文本的位置;

3、宏参数和#define定义中可以出现其他#define定义的变量;

4、宏不能出现递归;


# 和 ## 的作用

# 和 ## 都是在宏内实现的;

1、#把一个宏参数转化为对应的字符串;

2、##可以将位于##两端的符号合成一个符号;

#代码:

#include <stdio.h>
#define PRINT_1(value, format) printf("相加的值为:"format"\n", value)
#define PRINT_2(value, format) printf(""#value"相加的值为:"format"\n", value)
// #可以将宏的参数转化为对应的字符串;
int main()
{int a = 10;int b = 20;PRINT_1(a + b, "%d");PRINT_2(a + b, "%d");return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文学习——Class-Conditioned Latent Diffusion Model For DCASE 2023

文章目录 引言正文AbstractIntroductionSystem Overview2.1 Latent Diffusion with sound-class-based conditioning以声音类别为条件的潜在扩散模型2.2 Variational Autoencoder and neural vocoder变分自编码器和神经声码器FAD-oriented Postprocessing filter&#xff08;专…

Linux开启SSH

Linux开启SSH 1.虚拟机确定连通性 如果是虚拟机的话则需要进行确定和宿主主机之间能正常联通(不能联通还远程个啥) 获取到虚拟机的IP 参考文章:Linux获取本机IP地址使用宿主机ping一下虚拟机的IP查看是否联通 2.安装SSH服务端 安装工具来使得能够通过SSH进行连接 命令 sudo a…

springBoot组件注册

springBoot组件注册 前言1、创建组件文件2、写属性3、生成get和set方法4、以前注册的方法5、现在注册的方法6、在启动文件查看7、多实例Scope("prototype")8、注册第三方包导入对应的场景启动器注册组件查看是否存在也可以通过Import(FastsqlException.class)导入但是…

C++医院影像科PACS源码:三维重建、检查预约、胶片打印、图像处理、测量分析等

PACS连接DICOM接口的医疗器械&#xff08;如CT、MRI、CR、DR、DSA、各种窥镜成像系统设备等&#xff09;&#xff0c;实现图像无损传输&#xff0c;实现DICOM胶片打印机回传打印功能&#xff0c;支持各种图像处理&#xff0c;可以进行窗技术调节&#xff0c;与登记台管理系统共…

Spring Boot 中的 TransactionTemplate 是什么,如何使用

Spring Boot中的TransactionTemplate&#xff1a;简化事务管理 事务管理是任何应用程序中至关重要的部分&#xff0c;特别是在处理数据库操作时。Spring Boot提供了多种方式来管理事务&#xff0c;其中之一是使用TransactionTemplate。本文将深入探讨TransactionTemplate是什么…

树莓派玩转openwrt软路由:5.OpenWrt防火墙配置及SSH连接

1、SSH配置 打开System -> Administration&#xff0c;打开SSH Access将Interface配置成unspecified。 如果选中其他的接口表示仅在给定接口上侦听&#xff0c;如果未指定&#xff0c;则在所有接口上侦听。在未指定下&#xff0c;所有的接口均可通过SSH访问认证。 2、防火…

如何在手机上设置节日提醒和倒计时天数?

在平淡的生活和工作中&#xff0c;时不时有各种各样节日的点缀&#xff0c;为我们的日常增添了一些仪式感&#xff0c;例如春节、元宵节、情人节、端午节、七夕节等。此外还有一些特殊的日子也值得纪念&#xff0c;例如恋爱纪念日、结婚纪念日、亲朋好友生日等。面对这些节日&a…

CodeForces每日好题10.14

给你一个字符串 让你删除一些字符让它变成一个相邻的字母不相同的字符串&#xff0c;问你最小的删除次数 以及你可以完成的所有方/案数 求方案数往DP 或者 组合数学推公式上面去想&#xff0c;发现一个有意思的事情 例如1001011110 这个字符串你划分成1 00 1 0 1111 0 每…

Step 1 搭建一个简单的渲染框架

Step 1 搭建一个简单的渲染框架 万事开头难。从萌生到自己到处看源码手抄一个mini engine出来的想法&#xff0c;到真正敲键盘去抄&#xff0c;转眼过去了很久的时间。这次大概的确是抱着认真的想法&#xff0c;打开VS从零开始抄代码。不知道能坚持多久呢。。。 本次的主题是搭…

多城镇信息发布付费置顶公众号开源版开发

多城镇信息发布付费置顶公众号开源版开发 以下是多城镇信息发布付费置顶公众号的功能列表&#xff1a; 信息发布&#xff1a;用户可以在公众号上发布各类信息&#xff0c;如房屋租售、二手物品交易、招聘信息等。 信息置顶&#xff1a;用户可以选择付费将自己的信息置顶在公众…

vue2时间处理插件——dayjs

在vue时间处理上有很多的方法和实现&#xff0c;可以自己实现&#xff0c;但是效率不高&#xff0c;所以&#xff0c;在框架开发中我们一般不会手写&#xff0c;一般是使用集成的第三方插件来解决我们的问题&#xff0c;在vue3中大家一般都使用Moment.js来处理&#xff0c;所以…

print() 函数

二、print() 函数 这里先说一下 print() 函数&#xff0c;如果你是新手&#xff0c;可能对函数不太了解&#xff0c;没关系&#xff0c;在这里你只要了解它的组成部分和作用就可以了&#xff0c;后面函数这一块会详细说明的。 print() 函数由两部分构成 &#xff1a; 指令&a…

Folium笔记: Popup

1 介绍 在 folium 中&#xff0c;Popup 是一个用于在地图上显示附加信息的对象。当在地图上点击一个标记&#xff08;例如&#xff0c;一个点或者一个形状&#xff09;时&#xff0c;Popup 会显示出来。Popup 可以包含纯文本&#xff0c;但也可以包含HTML代码 2 主要参数 htm…

【SCSS篇】Vite+Vue3项目全局引入scss文件

文章目录 前言一、安装与使用1.1 安装1.2 scss 全局文件编写1.2.1 概述 1.3 全局引入和配置1.4 组件内使用 vue2 项目引入 sass附&#xff1a;忽略ts类型检测 前言 Sass 是世界上最成熟、最稳定、最强大的专业级CSS扩展语言&#xff01;在日常项目开发过程中使用非常广泛&…

C# Onnx Yolov8 Detect 涉黄检测

效果 项目 检测类别 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; usi…

蓝桥杯每日一题2023.10.14

年号字串 - 蓝桥云课 (lanqiao.cn) 题目描述 我们发现每个字母都与26紧密相关&#xff0c;其%26的位置就是最后一个字母&#xff0c;由于最开始将0做为了1故在写答案时需要注意细节问题 #include<bits/stdc.h> using namespace std; char s[] "ABCDEFGHIJKLMNOPQ…

Redis魔法:点燃分布式锁的奇妙实现

分布式锁是一种用于在分布式系统中控制对共享资源的访问的锁。它与传统的单机锁不同&#xff0c;因为它需要在多个节点之间协调以确保互斥访问。 本文将介绍什么是分布式锁&#xff0c;以及使用Redis实现分布式锁的几种方案。 一、前言 了解分布式锁之前&#xff0c;需要先了…

Linux CentOS8安装gitlab_ce步骤

1 下载安装包 wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/8/gitlab-ce-15.0.2-ce.0.el8.x86_64.rpm/download.rpm2 安装gitlab yum install policycoreutils-python-utilsrpm -Uvh gitlab-ce-15.0.2-ce.0.el8.x86_64.rpm3 更新配…

CSS悬停卡片翻转明信片效果源码附注释

运行效果演示: HTML页面代码: <!DOCTYPE html> <html lang="en" > <head>

二十一、【文本工具组】

文章目录 横排文本工具字符选项卡段落文字 横排文本工具 需要注意的是一些不是免费的商业字体&#xff0c;一定不要拿去使用&#xff0c;否则后边很容易会受到法律索赔。 在制作海报等一些图形时&#xff0c;需要经常用到文本工具我们需要对文本进行变形&#xff0c;分段&…