上海网络网站建/门户网站制作

上海网络网站建,门户网站制作,网站 营销型,万州网站建设果园路前言 从多个.c文件到达一个可执行文件的四步:   预处理–>编译–>汇编–>链接 预处理 预处理过程就是预处理器处理这些预处理指令(要不然编译器完全不认识),最终会生成 main.i的文件 主要做的事情有如下几点: 展开头文件展开宏条件编译删除注释添加行号等信息保留…

前言

  从多个.c文件到达一个可执行文件的四步:
  预处理–>编译–>汇编–>链接

预处理

在这里插入图片描述

  预处理过程就是预处理器处理这些预处理指令(要不然编译器完全不认识),最终会生成 main.i的文件
主要做的事情有如下几点:

  • 展开头文件
  • 展开宏
  • 条件编译
  • 删除注释
  • 添加行号等信息
  • 保留parama预处理指令
  1. 头文件展开—#include指令
    • #include <sdtio.h> 和 #include “stdio.h”
      对于<> 搜索顺序为
      • 通过GCC参数gcc-I指定的目录(注:大写的I 让我们自由指定的)。
      • 通过环境变量CINCLUDEPATH指定的目录。
      • GCC的内定目录。
        对于 " "的搜索时顺序
      • 项目当前目录(此时也可以用"…/LED/led.h"方式去搜索)
      • 通过GCC参数gcc-I指定的目录。
      • 通过环境变量CINCLUDEPATH指定的目录。
      • GCC的内定目录
    • 为什么把声明放在头文件里
      • 提供一个接口 方便其他文件通过声明调用对应的函数
      • 当我们的led.c 包含了 led.h的时候 也方便编译器做类型的检查
    • 头文件多次包含会增加可执行文件的体积吗?
      只要是使用了类似#pragma once 或者#ifndef 多次包含是不会的增加可执行文件的体积的
      同样的要注意:声明不会增加可执行文件的体积
  2. 宏展开#define 宏指令
    • 宏定义最小
      #define MIN(x,y) ((x) > (y) ? (y) : (x))
      因为宏只是做了一个替换所以对于如下代码
        #include <stdio.h>#define MIN(x,y) ((x) > (y) ? (y) : (x))//因为宏只是做了一个替换所以对于如下代码int main(){int a = 2 ;int b = 5;int c =  MIN(a++,b++);printf("c = %d a = %d b = %d\r\n",c,a,b); // a竟然等于4}

在这里可以用GNU C语法中的一些小技巧操作

        #define MIN(x,y) ({\typeof(x) _x = (x);\typeof(y) _y = (y);\_x > _y ? _x : _y;})
  • 定义一个很大的常数的时候
      #define MAX_LONG (100001000010000)UL //指定类型
  • ##连接符
      高端用法 看了好多代码都用这个 但是分析起来乱乱的,大概就是把两个字母连接到一起
        #define contact(x,y)  (x##y)int bc = 50;printf("bc = %d\r\n", contact(b,c));
  • offset_of与container_of
    之前写结构体的时候写过,权当复习一下
    #define offset_of(type, member)     ((size_t)(&((type *)0)->member))
    #define container_of(type,member,ptr) (type *)((size_t) ptr - offset_of(type,member))
    struct student {int height;char * name;
    };
    int main()
    {struct student stu;stu.height = 50;stu.name = "123456";char ** tmp_name = &stu.name;struct student* s = &stu;printf("%p  %p %ld\r\n",s, tmp_name,offset_of(struct student,height));struct student *new_s = container_of(struct student,name,tmp_name);new_s->height = 60;printf("%d\r\n",stu.height);
    }
    

``

  • 宏为什么要用 do {} while(0)
      如果去看linux源码也好还是RTOS等的代码也好 会有很多时候用到do_while(0) 它的作用是什么呢
    假设我们定义了
    #define MACRO() foo(); bar()
    此时我们写了这样的伪代码
    if (condition)
    MACRO();
    else
    baz();
    // 宏展开后和我们想要的就完全不一样了 直接就出错了
    // do {}while(0)可以保证宏作为一个整体执行 此时就可以定义一些局部变量
  1. 条件编译 #ifdef等指令
  • 条件编译指令
    在这里插入图片描述

    正常用的比较多的就是 #ifndef #define #endif这几个连用
    也有 #defined(VAR_X)之类的

  • #error指令
    如果发生错误直接中断编译过程
    在这里插入图片描述

  1. #pragma 指令
    • #pragma pack([n]):指示结构体和联合成员的对齐方式。
    • #pragma message(“string”):在编译信息输出窗口打印自己的文
      本信息。
    • #pragma warning:有选择地改变编译器的警告信息行为。
    • #pragma once:在头文件中添加这条指令,可以防止头文件多次
      编译。

编译

  真要讲编译我也是不配讲的 就我们知道这是在干嘛就行了
  编译就是把.c文件变成汇编文件的过程

  • 编译过程的6步
    词法分析 / 语法分析 / 语义分析 / 中间代码生成 / 汇编代码生成 / 目标代码生成
    • 语法错误: stynax error: 缺少分号 / {}没扩住 /
    • 语义错误: 类型不匹配 未定义的变量
      最终的结果就是生成.S文件
  • gcc的优化等级 gcc -O
    可以参考
    https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options
  • 交叉编译
    嵌入式开发板一般是ARM架构 然后PC是x86架构
    通过交叉编译器进行程序的编译

汇编

  汇编就是把汇编代码编程机器码 也就是比较熟悉的 xx.o文件了
  汇编过程最终会生成以零地址为链接起始地址的可重定位目标文件

链接

  把.o 文件进行组装 需要重定位 因为所有的.o文件的开头都是以0地址开头的
  链接主要分为3个过程:分段组装、符号决议和重定位

  • 分段组装
    不太好讲 基本就是通过一个脚本把多个文件按照段组合到一起
    在这里插入图片描述

  • 符号决议
    符号决议的核心就行 如果说变量/函数重名了怎么办

    • 不允许同时存在两个相同的强符号
      初始化的全局变量、函数名默认都是强符号,未初始化的全局变量默认是弱符号
      比如
        // b.cint i;   // 未初始化 是弱符号int main() {printf("%d\r\n",i);  //i的值是20}// a.cint i = 20;

__attribute__关键字 可以把强符号强行转换为弱符号 attribute((weak))

  • 使用弱符号的好处
    • 自定义重名函数
      这里在嵌入式里最常见的就是中断服务函数的弱定义了
      当我们需要重新定义中断服务函数的时候 只需要保证名字很start.S的名字一致就行,链接的时候就知道链接到哪里了
      在这里插入图片描述

    • 检查该函数是否存在
      // b.c
      #include <stdio.h>
      int global_k;
      char global_i;
      attribute((weak)) void func()
      {
      printf(“这被定义为弱符号了\r\n”);
      }
      int main()
      {
      printf(“%d\r\n”,global_k);
      if(func)
      func(); //调用的是强符号的函数
      return 0;
      }
      // a.c
      #include <stdio.h>
      int global_k = 20;
      int global_i;
      void func()
      {
      printf(“这被定义为强符号了 fun\r\n”);
      }

  • 同样都是弱符号 谁体积大谁胜出
  • 重定位
    因为要把不同的文件链接到一块 所以位置就会发生变化

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

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

相关文章

用Deepseek写一个 HTML 和 JavaScript 实现一个简单的飞机游戏

大家好&#xff01;今天我将分享如何使用 HTML 和 JavaScript 编写一个简单的飞机游戏。这个游戏的核心功能包括&#xff1a;控制飞机移动、发射子弹、敌机生成、碰撞检测和得分统计。代码简洁易懂&#xff0c;适合初学者学习和实践。 游戏功能概述 玩家控制&#xff1a;使用键…

面向高质量视频生成的扩散模型方法-算法、架构与实现【附核心代码】

目录 算法原理 架构 代码示例 算法原理 正向扩散过程&#xff1a;从真实的视频数据开始&#xff0c;逐步向其中添加噪声&#xff0c;随着时间步 t 的增加&#xff0c;噪声添加得越来越多&#xff0c;最终将原始视频数据变成纯噪声。数学上&#xff0c;t 时刻的视频数据与 t…

游戏引擎学习第149天

今日回顾与计划 在今天的直播中&#xff0c;我们将继续进行游戏的开发工作&#xff0c;目标是完成资产文件&#xff08;pack file&#xff09;的测试版本。目前&#xff0c;游戏的资源&#xff08;如位图和声音文件&#xff09;是直接从磁盘加载的&#xff0c;而我们正在将其转…

ForceMimic:以力为中心的模仿学习,采用力运动捕捉系统进行接触丰富的操作

25年3月来自上海交大卢策吾教授团队的论文“ForceMimic: Force-Centric Imitation Learning with Force-Motion Capture System for Contact-Rich Manipulation”。 在大多数接触丰富的操作任务中&#xff0c;人类会将随时间变化的力施加到目标物体上&#xff0c;以补偿视觉引…

【愚公系列】《Python网络爬虫从入门到精通》045-Charles的SSL证书的安装

标题详情作者简介愚公搬代码头衔华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xff0c;阿里云签约作者&#xff0c;腾讯云优秀博主&…

vulnhub靶场【digitalworld.local系列】的electrical靶机

前言 靶机&#xff1a;digitalworld.local-electrical&#xff0c;IP地址为192.168.10.12&#xff0c;后期因为卡顿&#xff0c;重新安装&#xff0c;ip地址后面为192.168.10.11 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.6 kali采用VMware虚拟机&#xff0c;靶机…

macos 程序 运行

sudo xattr -r -d com.apple.quarantine [/Applications/Name]使用stow 管理配置文件

共享内存的原理和创建

目录 共享内存的原理 共享内存的创建 代码实现创建 共享内存的管理指令 我们今天来学习共享内存&#xff01;&#xff01;&#xff01; 共享内存的原理 两个进程同时使用内存中开辟的共享空间进行通信就是建立并使用共享内存进行进程间的通信。System V 共享内存&#xf…

3.10[A]cv

核心模块&#xff1a; rasterizer&#xff1a;光栅化器&#xff0c;负责三角形遍历和像素绘制Shader&#xff1a;包含顶点着色器和多种片元着色器Texture&#xff1a;纹理处理模块 顶点着色器的计算量一般远小于片元着色器。因为组成三角形的顶点相对有限&#xff0c;而片元需…

mac使用Homebrew安装miniconda(mac搭建python环境),并在IDEA中集成miniconda环境

一、安装Homebrew mac安装brew 二、使用Homebrew安装miniconda brew search condabrew install miniconda安装完成后的截图&#xff1a; # 查看是否安装成功 brew list环境变量&#xff08;无需手动配置&#xff09; 先执行命令看能不能正常返回&#xff0c;如果不能正常…

WWDG窗口看门狗原理

WWDG&#xff08;窗口看门狗&#xff09;在窗口期喂狗 作用&#xff1a; 原理&#xff1a; 框图 WWDG寄存器&#xff1a; WWDG_CR控制寄存器 WWDG_CFR配置寄存器 状态寄存器WWDG_SR 超时时间计算公式 最小最大超时值 HAL配置函数&#xff1a; 1. IWDG 和 WWDG 的区别 IWDG&…

无公网IP也能远程控制Windows:Linux rdesktop内网穿透实战

文章目录 前言1. Windows 开启远程桌面2. Linux安装rdesktop工具3. Win安装Cpolar工具4. 配置远程桌面地址5. 远程桌面连接测试6. 设置固定远程地址7. 固定地址连接测试 前言 如今远程办公已经从一种选择变成了许多企业和个人的必修课&#xff0c;而如何在Linux系统上高效地访…

Pygame实现射击鸭子游戏3-2

2 鸭子类Target的创建 2.1 __init__()函数 Target类的__init__()函数代码如图5所示。 图5 __init__()函数代码 其中&#xff0c;第18行将Target类声明为pygame.sprite.Sprite类的子类&#xff1b;第19行代码中&#xff0c;__init__()函数的img_path参数表示鸭子图片的文件名…

五、OpenGL中Shader与C++数据传输

文章目录 一、概述二、Shader 代码文件的基本格式三、Shader的向量语法介绍四、Shader之间的数据传输五、Shader与C的数据传输uniform六、完整示例 一、概述 在 OpenGL 中&#xff0c;Shader&#xff08;着色器&#xff09;使用 GLSL&#xff08;OpenGL Shading Language&…

【3DMAX插件】3DMAX建筑大师插件MasterBuilder使用方法

3DMAX建筑大师插件是一款专为3DMAX设计的程序化&#xff08;参数化&#xff09;建筑建模工具&#xff0c;其最大特点是能够一键生成建筑模型&#xff0c;极大地提升了工作效率。该插件配备了多种结构控制选项&#xff0c;涵盖阳台、门窗、栏杆、楼顶水塔等附属建筑元素&#xf…

隐私保护在 Facebook 用户身份验证中的应用

在这个数字化的时代&#xff0c;个人隐私保护成为了公众关注的焦点。社交媒体巨头 Facebook 作为全球最大的社交平台之一&#xff0c;拥有数十亿用户&#xff0c;其在用户身份验证过程中对隐私保护的重视程度直接影响着用户的安全感和信任度。本文将探讨 Facebook 在用户身份验…

Swift Package Manager (SPM) 创建并集成本地库

在macOS 项目中&#xff0c;使用 Swift Package Manager (SPM) 创建并集成本地库的完整步骤。 创建一个macos应用程序&#xff0c;选择 swift、oc、swiftui都可以。 创建好应用之后&#xff0c;开始创建SPM本地库。 打开终端app&#xff0c;进入项目根目录&#xff0c;逐次输…

渗透测试之利用sql拿shell(附完整流程+防御方案)【下】

导读: 时刻保持谦逊,始终保持学习,探寻事物的本质,不要把事情复杂化 话不多说,书接上回 三、利用日志getshell 利用条件: 拥有网站的写入权限知道网站的绝对路径数据库日志开启 实际操作: (1)查看数据库日志是否开启以及路径 show variables like %general%; (2…

【HarmonyOS Next之旅】DevEco Studio使用指南(二)

目录 1 -> 工程模板介绍 2 -> 创建一个新的工程 2.1 -> 创建和配置新工程 2.1.1 -> 创建HarmonyOS工程 2.2.2 -> 创建OpenHarmony工程 1 -> 工程模板介绍 DevEco Studio支持多种品类的应用/元服务开发&#xff0c;预置丰富的工程模板&#xff0c;可以根…

猫耳大型活动提效——组件低代码化

1. 引言 猫耳前端在开发活动的过程中&#xff0c;经历过传统的 pro code 阶段&#xff0c;即活动页面完全由前端开发编码实现&#xff0c;直到 2020 年接入公司内部的低代码活动平台&#xff0c;满足了大部分日常活动的需求&#xff0c;运营可自主配置活动并上线&#xff0c;释…