C语言编译过程

2023-05-16

C语言的编译过程:

预处理、编译、汇编、链接

gcc -E hello.c -o hello.i 1、预处理

gcc -S hello.i –o hello.s 2、编译

gcc -c hello.s -o hello.o 3、汇编

gcc hello.o -o hello_elf 4、链接

1:预编译

      将.c 中的头文件展开、宏展开 生成的文件是.i文件

2:编译

      将预处理之后的.i 文件生成 .s 汇编文件

3、汇编

      将.s汇编文件生成.o 目标文件

4、链接

      将.o 文件链接成目标文件

include

      #include<>//用尖括号包含头文件,在系统指定的路径下找头文件

      #include "" //用双引号包含头文件,先在当前目录下找头文件,找不到,再到系统指定的 路径下找。

      注意:include 经常用来包含头文件,可以包含 .c 文件,但是大家不要包含.c

      因为include包含的文件会在预编译被展开,如果一个.c 被包含多次,展开多次,会导致函数重复定义。 所以不要包含.c 文件。

      注意:预处理只是对include 等预处理操作进行处理并不会进行语法检查 这个阶段有语法错误也不会报错,第二个阶段即编译阶段才进行语法检查。

define

定义宏用define 去定义

宏是在预编译的时候进行替换。

1、不带参宏 #define PI 3.14

      在预编译的时候如果代码中出现了PI 就用 3.14去替换。

      宏的好处:只要修改宏定义,其他地方在预编译的时候就会重新替换。 注意:宏定义后边不要加分号。

 #include <stdio.h>

   //宏定义的好处是只要改变了定义是的常量表达式,则代码中只要使用这个宏定义的位置都
   会改变
 #define PI 3.1415926

 int main(int argc, char *argv[])
 {
   printf("PI = %lf\n", PI);

   double d = PI;
   printf("d = %lf\n", d);

   return 0;
 }

执行结果

宏定义的作用范围,从定义的地方到本文件末尾。

如果想在中间终止宏的定义范围

#undef PI //终止PI的作用

 2、带参宏

#define S(a,b) a*b

注意带参宏的形参 a和b没有类型名,

S(2,4) 将来在预处理的时候替换成 实参替代字符串的形参,其他字符保留,2 * 4。

 #include <stdio.h>

 //带参宏
 //带参宏类似于一个简单的函数,将函数的参数进行设置,就可以传递给对应的表达式
 //#define S(a, b) a*b
 #define S(a, b) ((a)*(b))

 int main(int argc, char *argv[])
 {
   printf("%d\n", S(2, 4));
   //注意:宏定义只是简单的替换,不会自动加括号
   //带参宏1:2 + 8 * 4 = 34
   //带参宏2:((2 + 8) * (4)) = 40
   printf("%d\n", S(2 + 8, 4));

   return 0;
 }

3、带参宏和带参函数的区别

带参宏被调用多少次就会展开多少次,执行代码的时候没有函数调用的过程,不需要压 栈弹栈。所以带参宏,是浪费了空间,因为被展开多次,节省时间。

带参函数,代码只有一份,存在代码段,调用的时候去代码段取指令,调用的时候要压 栈弹栈。有个调用的过程。所以说,带参函数是浪费了时间,节省了空间。

带参函数的形参是有类型的,带参宏的形参没有类型名。

如果功能实现的代码相对简单,并且不需要开辟太多的空间,可以选择使用带参宏,但 是大多数情况都会使用函数。

4、选择性编译

1、

#ifdef AAA

  //代码段一

#else

  //代码段二

#endif

如果在当前.c ifdef 上边定义过AAA ,就编译代码段一,否则编译代码段二

注意和if else语句的区别,if else 语句都会被编译,通过条件选择性执行代码 而 选择性编译,只有一块代码被编译

 #define AAA

 int main(int argc, char *argv[])
 {
   #ifdef AAA
     printf("hello kitty!!\n");
   #else
     printf("hello 千锋edu\n");
   #endif
     return 0;
 }

2、

#ifndef AAA

      //代码段一

#else

      //代码段二

#endif

和第一种互补。

这种方法,经常用在防止头文件重复包含。

常用于多文件编程中.h的第一行就是#ifndef,最后一行就是#endif。

3、
 

#if 表达式

 //  程序段一

#else

 //  程序段二

#endif

   //如果表达式为真,编译第一段代码,否则编译第二段代码 这种形式一般用于注释多行代码 #if 0 ... #endif

选择性编译都是在预编译阶段干的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言编译过程 的相关文章

  • git使用命令行拉取代码更新到站点

    1 把服务器端的公钥添加到gitee或者阿里云效 xff1b 2 创建一个全新干净的站点目录 xff1b 3 进入后这个目录 xff0c 执行 git clone lt repository gt 在这里 xff0c 点 表示当前目录 4
  • 单片机寄存器的理解

    学习目标 xff1a 对寄存器的理解 学习内容 xff1a 本来在学DMA xff0c 突然看到江科大的b站视频 xff0c 在他的DMA视频中对寄存器进行了理解 xff0c 我觉得十分巧妙 xff0c 这是当时截的图 xff0c 中间竖着
  • python 类变量详解

    强烈建议先看我之前的面向对象基本了解 python中 xff0c 类变量又叫做类属性 然而类属性有分为3个不同的类型 类属性 xff0c 实例属性 xff0c 局部变量 class a 类属性 hobby 61 39 play sport
  • Python运行环境Ngrok内网穿透

    这次就教大家怎么在手机或机顶盒上运行Ngrok内网穿透 首先下载安卓上的Python运行环QPython apk 官网 http www qpython com 下载完后开始安装 xff0c 怎么安装安卓软件不用我怎么教了吧 复制pytho
  • 记一次PWN机(Vmware和Docker+VNC)的搭建

    基于Vmware搭建虚拟机 学长已经提供了镜像 xff0c 在Vmware界面打开那个镜像 xff0c 开机即可 Vmware和镜像下载地址 xff1a 链接 xff1a https pan quark cn s 057a23e631f5
  • vue.runtime.esm.js?2b0e:619 [Vue warn]: Invalid prop: type check failed for prop “index“. Expected S

    vue runtime esm js 2b0e 619 Vue warn Invalid prop type check failed for prop 34 index 34 Expected String with value 34 1
  • 解决vscode上边菜单栏不显示的问题

    由于我们不小心点击了哪个键 xff0c 导致上边的菜单栏不显示 两种解决方案 方法一 xff1a 点击下面的这个按钮 xff0c 会弹出一个弹框 点击一下菜单栏的可见性 xff0c 即可出来 方式二 xff1a 使用快捷键Ctrl 43 S
  • node+vue搜索和分页功能实现

    前端代码 lt template gt lt div class 61 34 main box 34 gt lt 卡片区 gt lt el card gt lt 搜索 gt lt el input placeholder 61 34 请输入
  • React面试题最全

    1 什么是虚拟DOM xff1f 虚拟DOM是真实DOM在内存中的表示 xff0c ul的表示形式保存在内存中 xff0c 并且与实际的DOM同步 xff0c 这是一个发生在渲染函数被调用和元素在屏幕上显示的步骤 xff0c 整个过程被称为
  • vue项目页面空白但不报错产生的原因分析

    vue项目中我们请求一个路由 xff0c 打开页面发现页面是空白的 xff0c 产生的主要原因有四种 xff1a 1 路由重复 如果配置了两个路由是重复的 xff0c 比如配置了两个 path xff0c 那么访问就会看到空白页面 xff0
  • react--电商商品列表使用

    目录 整体页面效果 项目技术点 拦截器的配置 主页面 添加商品 分页 xff0c 搜索 修改商品 删除商品 完整代码 整体页面效果 项目技术点 antd组件库 xff0c 64 ant design icons antd的图标库axios
  • 服务器端升级或者切换node版本

    1 查看版本 nvm list 2 选择你需要的版本 nvm use v18 15 0
  • lodash防抖节流

    应用场景 xff1a 当用户高频率的触发事件 xff0c 事件较短 xff0c 内部出现卡顿现象 解决方法 xff1a 防抖节流 防抖节流功作用 xff1a 主要目的是为了降低高频事件触发 xff0c 减少dom操作或请求次数 xff0c
  • 使用webpack(4版本)搭建vue2项目

    在学习webpack之前 xff0c 也从网上搜过一些用webpack搭建vue项目的博客 xff0c 但是在自己使用的时候会报各种的问题 xff0c 报错的根本原因其实就是版本的问题 xff0c 以下代码是经过解决了许多报错问题研究出来最
  • VUE调用摄像头PC

    页面效果 实现代码 lt template gt lt div id 61 34 app 34 gt lt router view gt lt 开启摄像头 gt lt Button type 61 34 primary 34 64 clic
  • koa2的脚手架koa-generator使用

    我们在搭建项目的时候 xff0c 会使用一些脚手架 xff0c 今天我们使用koa2的脚手架koa generator 使用非常简单 首先 xff0c 我们需要全局安装 npm install g koa generator 创建项目 ko
  • css行内元素、块元素、行内块元素的区别

    行内元素的特点 xff1a 1 和其他元素在一行显示 2 元素的宽度 高度 行高及底部边距不可编辑 3 元素的宽度就是它包含的文字或图片的宽度 xff0c 不可改变 4 行内元素只能容纳纯文本或者是其他的行内元素 xff08 a标签除外 x
  • STM32CubeMX安装

    一 STM32CubeMX下载 官网地址 xff1a STM32CubeMX STM32Cube初始化代码生成器 意法半导体STMicroelectronics 官网下载需要注册账号 网盘链接 xff08 6 8 xff09 xff1a 链
  • 关于汇编指令sar右移32位的情况,记录一下

    网上 对sar指令右移超过31位的情况 比如右移32位 右移33位 很少有详细的说明 为了防止下一次还有像我这样傻x的人不会 我就记录一下 我不会过多说基础 基础了解就行 xff0c 能懒就懒 1字节 sar 我们以一字节为例子 00412

随机推荐

  • vs2022 汇编环境配置,xxx.inc头文件找不到,出现报错,不影响正常代码生成的解决方案

    解决方案前提 1 你的include和lib路径已经配置好了 然后代码可以正常的生成一个exe 2 安装了的AsmDube 其实inc文件找不到 是AsmDub找不到 不是vs2022找不到 所以你就去AsmDube修改一下 所以你只需要告
  • 关于8皇后解决方法的浅析

    关于8皇后解决方法的浅析 众所周知 xff0c 解决8皇后最普遍的方法是回溯法 那具体是怎么样的呢 xff1f 大概思路 xff1a 定义一个int型数组queen xff0c 角标 1 2 7 代表皇后所在的行 xff0c 值代表皇后所在
  • Latex闲谈

    关于latex呢 xff0c 首先它是一个排版工具 xff0c 是一个将文章排版和文章内容分开的一个排版工具 有个问题是你是边写边排版呢还是用word写完之后再来说是进行这个排版呢 xff0c 对于我而言 xff0c 我更倾向于后者 xff
  • Linux下phpmyadmin忘记root的登录密码,找回方法

    第一步 xff1a 执行 etc init d mysql stop 结束当前正在运行的mysql进程 第二步 xff1a 执行 usr bin mysqld safe skip grant tables 用mysql安全模式运行并跳过权限
  • matlab郭彦甫-听课笔记-02

    可以分块 xff0c 分块之后可以进行分块执行run section 关系运算符 xff1a 61 不等于 取余函数 xff1a mod a b rem a b switch case case case otherwise 连乘函数 xf
  • 51单片机硬件介绍

    1 单片机是啥 单片机 xff0c 简称MCU xff0c 是微型计算机 xff0c 集成了一部计算机许多硬件功能 xff0c 有CPU 存储器 xff08 ROM RAM xff09 等 2 有了这样一个单片机芯片后 xff0c 怎么将程
  • matlab硬件支持包离线安装-(安装文件夹错误)

    dSupport Software Downloader MATLAB amp Simulinkhttps ww2 mathworks cn support install support software downloader html
  • 小结:卸载SolidWorks2018->重新安装系统->安装SolidWorks2020

    因为卸载SW2018卸载不干净 xff0c 所以在安装SW20版一直在出错 xff0c 错误如下 xff1a 这个错误解决后继续安装 xff0c 又发现没有出现原本序列号的那一界面 xff0c 然后还有异型孔向导安装不了 xff0c 最后还
  • FreeRTOS信号量 基于STM32

    目录 概述 一 信号量基本概念 1 二值信号量 2 计数信号量 3 互斥信号量 4 递归信号量 二 二值信号量运作机制 三 计数信号量运作机制 四 常用信号量函数接口讲解 1 创建二值信号量 xSemaphoreCreateBinary 2
  • FreeRTOS互斥量 基于STM32

    文章目录 一 互斥量基本概念 二 互斥量的优先级继承机制 三 互斥量应用场景 四 互斥量运作机制 五 互斥量函数接口讲解 1 互斥量创建函数 xSemaphoreCreateMutex 2 递归xSemaphoreCreateRecursi
  • FreeRTOS事件组 基于STM32

    概述 文章对事件组的 xff0c 应用场景 xff0c 运作机制 xff0c 以及事件的创建 xff0c 删除 xff0c 等待 xff0c 置位 xff0c 同步等操作 文章目录 概述 一 事件标志组简介 1 事件位 事件标志 2 事件组
  • FreeRTOS任务通知 基于STM32

    文章目录 一 任务通知简介 二 任务通知的运作机制 三 任务通知的函数接口讲解 1 xTaskGenericNotify 2 xTaskNotifyGive 3 vTaskNotifyGiveFromISR 4 xTaskNotify 5
  • FreeRTOS软件定时器 基于STM32

    文章目录 一 软件定时器的基本概念 二 软件定时器应用场景 三 软件定时器的精度 四 软件定时器的运作机制 五 软件定时器函数接口讲解 1 软件定时器创建函数 xTimerCreate 2 软件定时器启动函数 xTimerStart 3 软
  • FreeRTOS内存管理 基于STM32

    目录 一 内存管理的基本概念 二 内存管理的应用场景 三 heap 4 c 1 内存申请函数 pvPortMalloc 2 内存释放函数 vPortFree 四 内存管理的实验 五 内存管理的实验现象 一 内存管理的基本概念 在计算系统中
  • 关于ECSHOP模板架设的服务器php版本过高报错的解决方法集合

    1 admin index php admin sms url php ECSHOP模板 报错 xff1a Strict Standards mktime You should be using the time function inst
  • FreeRTOS中断管理 基于STM32

    文章目录 一 异常与中断的基本概念 二 中断的介绍 三 和中断相关的名词解释 四 中断管理的运作机制 五 中断延迟的概念 六 中断管理的应用场景 七 中断管理讲解 八 中断管理实验 九 中断管理实验现象 一 异常与中断的基本概念 异常是导致
  • 链表基础知识详解(非常详细简单易懂)

    概述 xff1a 链表作为 C 语言中一种基础的数据结构 xff0c 在平时写程序的时候用的并不多 xff0c 但在操作系统里面使用的非常多 不管是RTOS还是Linux等使用非常广泛 xff0c 所以必须要搞懂链表 xff0c 链表分为单
  • FreeRTOS临界段的保护

    什么是临界段 临界段用一句话概括就是一段在执行的时候不能被中断的代码段 在 FreeRTOS 里面 xff0c 这个临界段最常出现的就是对全局变量的操作 xff0c 全局变量就好像是一个枪把子 xff0c 谁都可以 对他开枪 xff0c 但
  • SPI通讯协议详解 基于STM32

    SPI 协议简介 SPI 协议是由摩托罗拉公司提出的通讯协议 Serial Peripheral Interface xff0c 即串行外围设备接口 xff0c 是 一种高速全双工的通信总线 它被广泛地使用在 ADC LCD 等设备与 MC
  • C语言编译过程

    C语言的编译过程 xff1a 预处理 编译 汇编 链接 gcc E hello c o hello i 1 预处理 gcc S hello i o hello s 2 编译 gcc c hello s o hello o 3 汇编 gcc