当前位置: 首页 > news >正文

C语言 DAY07:预编译,宏,选择性编译,库(静态库,动态库)

声明与定义分离

声明:将声明单独封装成一个以.h为后缀名的头文件

定义:将定义的变量,函数,数组所在的源文件单独封装成一个.c文件。其实就是在源文件基础上将定义过的所有东西的声明分离出去就是了。

注意:1.声明的.h文件名和.c结尾的源文件名要相同、

           2.一个源文件对应一个头文件

1.预编译

1.程序编译

1.预编译

        展开头文件

        定义宏

        选择性编译

        注意:

                展开头文件必须以#开头 

2.编译

3.汇编

4.链接      

2.include

作用:展开头文件

语法:

        #include<> 尖括号代表的头文件是在系统指定文件中找该库,具体在lib/或者在usr/lib文件中找

        #include""  "" 代表的是自己定义的库,会先在当前目录文件夹下找,如果找不到再在系统指定文件夹中找

注意:
1,include 经常用来包含头文件,可以包含 .c 文件,但是大家不要包含.c ,因为 include 包含的文
件会在预编译被展开,如果一个.c 被包含多次,展开多次,会导致函数重复定义。所以不要包含.c 文件
2,预处理只是对 include 等预处理操作进行处理并不会进行语法检查
这个阶段有语法错误也不会报错,第二个阶段即编译阶段才进行语法检查

3.宏(define)

1.定义不带参的宏

        define pi(宏名)  值

       注意:1.定义不带参的宏,值可以不写

                  2.不带参的宏定义不要后面加分号

                  3.只能在当前文件中使用

                  4.在宏定义后,取消定义前使用

例子:      

        #include <stdio.h>
        #define PI 3.14
        #define X
        int main(int argc, char const *argv[])
        {
        printf("PI=%f\n",PI);
        #undef PI //取消宏定义
        //printf("PI=%f\n",PI);
        return 0;
        }

2.定义带参的宏

        define 宏名(形参) a + b(体) ;

3.注意:

        1.结尾要加分号

        2.括号中可以加形参,后面运算表达式不能省

        3.形参没有数据类型

        4.不止在当前文件中使用,可以在别的文件中使用

4.带参和不带参的宏的区别:

        宏:在预编译时对其进行替换,如果一个文件中多次使用宏,那意味着要替换多次,此时就需占用内存,所以占据的内存多

                产生的预编译时期

                占内存多

                速度快
        
        函数:在程序运行时在代码区存储一份,每次调用该函数都需在代码区寻找,将其放入栈内存中(压栈),当函数执行完毕后,从栈中移除(弹栈)
                产生在运行时
                
                占内存少
5.#undef   宏名          //取消宏定义

6.总结

        宏就是在预编译时期对其进行替换

        不带参宏替换的是一个值

        带参宏替换的是一段代码   

4.选择性编译

作用:选择代码是否被编译

语法:

2.库

作用:

        也叫代码库,可以将一些目标文件放在一起合并方便使用

分类:

1.静态库

2.动态库

动态库与静态库的区别:

注意:

程序中引入的文件在动态库与静态库同时存在两份

静态编译程序引入静态库中的该文件

动态编译程序引入动态库中的该文件

编辑命令:

静态库:

        gcc  -static  源文件名  - o   生成的可执行文件名

动态库:
        gcc  源文件名  - o   生成的可执行文件名

静态库:

制作:

        gcc -c 源文件名.c -o 生成的二进制文件名.o

        ar rc lib静态库名称.a 生成的二进制文件名.o

        注意:静态库起名的时候必须以 lib 开头以 .a 结尾
使用:
        情况1: 使用静态库的文件与静态库在同一文件夹下
                命令:
                gcc 源文件名 静态库名称 -o 生成的可执行文件名
                
情况 2: 使用静态库的文件与静态库不在同一文件夹下                 
                注意:
                为了让静态库文件与其对应的头文件和使用静态库文件不在同一文件夹下
                所以创建includes与 libs 文件夹
                includes文件用于存储头文件
                libs文件夹存储静态库文件
                mkdir includes
                mkdir libs
                mv myfun.h includes/
                mv libmyfun.a libs/
                -L 引用的静态库所在的路径
                -l 静态库名, 不要 lib .a
                -I 头文件所在路径
                
                命令:
                        gcc 源文件名 -L 静态库所在的路径 -l 静态库名 -I 头文件所在路径 -o 生成的可执行文件名
        情况 3: 静态库文件与对应的头文件在系统文件夹下
                
        系统库路径:
                /usr/include 存储头文件
                /usr/lib 或 /lib 存储库文件
        注意:
                为了让静态库文件与其对应的头文件和系统文件夹下,所以需要移动
                sudo mv includes/myfun.h /usr/include
                sudo mv libs/libmyfun.a /usr/lib
        命令:
                gcc 源文件名 -l 静态库名 -o 生成的可执行文件名

动态库

制作:

        命令:

                gcc -shared 源文件名 -o 生成的动态库文件名.so

使用:

        情况1:使用动态库的文件与动态库在同一文件夹下

                命令:

                        gcc 源文件名 动态库名称 -o 生成的可执行文件名

        情况2:使用静态库的文件与静态库不在同一文件夹下

                命令:

                        gcc 源文件名 -L 动态库所在路径 -l 动态库名称 -I 头文件所在路径
                注意:
                        动态库名需要去掉前面的lib与后面.so

        情况3:静态库文件与对应的头文件在系统文件夹下

                命令:

                        gcc 源文件名 -l 静态库名 -o 生成的可执行文件名

注意:

        运行中出现动态库找不到问题,需要将动态库所在目录导入用户环境变量

        export LD_LIBRARY_PATH=库文件所在路径:$LD_LIBRARY_PATH

        export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH

        

相关文章:

C语言 DAY07:预编译,宏,选择性编译,库(静态库,动态库)

声明与定义分离 声明&#xff1a;将声明单独封装成一个以.h为后缀名的头文件 定义&#xff1a;将定义的变量&#xff0c;函数&#xff0c;数组所在的源文件单独封装成一个.c文件。其实就是在源文件基础上将定义过的所有东西的声明分离出去就是了。 注意&#xff1a;1.声明的…...

[EFI]asus strix b760-i 13900F电脑 Hackintosh 黑苹果efi引导文件

硬件型号驱动情况主板 asus strix b760-i 处理器 I9 13900F 已驱动内存crucial ddr5-5200 64gb(32gb*2)(overclock 5600)已驱动硬盘 WD black sn850 500g*2 已驱动显卡rx570已驱动声卡Realtek ALCS1220A已驱动网卡Intel I225-V 2.5 Gigabit Ethernet已驱动无线网卡蓝牙Fevi T91…...

力扣383.赎金信

原题链接&#xff1a;383.赎金信 根据题意得出&#xff0c;需要判断第一个字符串内的字符有没有都在第二个字符串内出现(会有重复字符)&#xff0c;并且范围限制在26个英文小写字母 此时可以考虑用一个数组map 作哈希法映射操作 先将遍历第一个字符串&#xff0c;并让每个字符…...

CORS的原理以及在Node.js中的使用

在前端浏览器中的JavaScript代码发起HTTP请求到服务器的Node.js程序&#xff0c;CORS&#xff08;跨域资源共享&#xff09;会在以下几个步骤中发挥作用&#xff1a; 前端JavaScript代码发起请求&#xff1a; 前端浏览器中的JavaScript代码使用XMLHttpRequest对象或Fetch API等…...

kotlin实现单例模式

kotlin实现单例模式&#xff0c;大体分为两种方式&#xff0c;一种饿汉式单例模式&#xff0c;一种懒汉式单例模式。 1.饿汉式单例模式 在类前面加上object关键字&#xff0c;就实现了饿汉式单例模式&#xff1a; object singletonDemo { }在kotlin中&#xff0c;使用这种方式…...

【Java】LinkedList 集合

LinkedList集合特点 LinkedList 底层基于双向链表实现增删 效率非常高&#xff0c;查询效率非常低。 LinkedList源码解读分析 LinkedList 是双向链表实现的 ListLinkedList 是非线程安全的&#xff08;线程是不安全的&#xff09;LinkedList 元素允许为null,允许重复元素Linked…...

MySQL-Galera-Cluster集群详细介绍

目录 一、什么是Mysql集群&#xff1f;1.单节点mysql存在的常见问题2.mysql集群介绍3.Mysql集群的优点和风险 二、Mysql集群的一些疑问1.mysql的AB复制和Galera Cluster有什么区别&#xff1f;2.什么情况下适用AB复制&#xff0c;什么情况下使用Galera cluster&#xff1f;3.可…...

JavaScript从入门到精通系列第二十六篇:详解JavaScript中的Math对象

大神链接&#xff1a;作者有幸结识技术大神孙哥为好友&#xff0c;获益匪浅。现在把孙哥视频分享给大家。 孙哥连接&#xff1a;孙哥个人主页 作者简介&#xff1a;一个颜值99分&#xff0c;只比孙哥差一点的程序员 本专栏简介&#xff1a;话不多说&#xff0c;让我们一起干翻J…...

u盘直接拔出文件丢失怎么找回?u盘文件恢复办法分享!

u盘作为一种便捷的数据存储设备&#xff0c;被广泛地使用。通过u盘&#xff0c;我们可以在不同设备之间轻松传输文件&#xff0c;然而有时候&#xff0c;我们可能因为匆忙或疏忽并未安全弹出u盘&#xff0c;而是直接将u盘拔出&#xff0c;进而导致重要文件丢失&#xff0c;u盘直…...

rust学习-LinkedList

介绍 A doubly-linked list with owned nodes. 自有节点的双向链表 pub struct LinkedList<T, A = Global> whereA: Allocator, {/* private fields */ }使用 Vec 或 VecDeque 几乎总是更好,因为基于数组的容器通常更快、内存效率更高,并且可以更好地利用 CPU 缓存 …...

搭上直播快车,文旅迎来了更大爆发期?

“直播累计观看人数1083万人次&#xff0c;同期在线峰值10万人&#xff0c;抖音平台销售额800万元&#xff0c;荣登食遍天下榜第一名”。 10月28日&#xff0c;“东方甄选看世界”无锡专场直播落幕&#xff0c;又创造了新成绩&#xff0c;“文旅直播”这一新带货模式的发展可行…...

【智能座舱系列】- 深度解密小米Hyper OS,华为HarmonyOS区别

上一篇文章《小米的澎湃OS到底牛不牛?与鸿蒙系统之间差距有多大》,从多个方面比较了小米Hyper OS 与 华为HarmonyOS的区别,本篇文章继续从架构层面深度解读两者本质的区别。 小米澎湃OS是“以人为中心,打造人车家全生态操作系统”,该系统基于深度进化的Android以及自研的V…...

kafka-consumer-groups.sh

通过 kafka-consumer-groups.sh 脚本查看或变更消费组的信息。 查看消费者组信息 ./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list 查看指定消费者组的消费位移 ./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group g…...

数据仓库-拉链表

在数据仓库中制作拉链表&#xff0c;可以按照以下步骤进行&#xff1a; 确定需求&#xff1a;首先明确需要使用拉链表的场景和需求。例如&#xff0c;可能需要记录历史数据的变化&#xff0c;以便进行时间序列分析等。设计表结构&#xff1a;在数据仓库中&#xff0c;拉链表通…...

【Docker】一些可以直接用的Docker环境

这里罗列一些打包的镜像&#xff0c;方便直接使用。 cu11.6ubuntu18.04 docker push kevinchina/deeplearning:cu11.6ubuntu18.04 FROM nvidia/cuda:11.6.2-cudnn8-devel-ubuntu18.04 RUN apt-get update && apt-get install -y wget git vim curl RUN wget http://…...

Unity2D中瓦片地图的创建与绘制教程

Unity2D中瓦片地图的创建与绘制 素材切割创建地图创建瓦片绘制地图瓦片调色板画笔拓展素材资源链接 素材切割 选中以下素材&#xff0c;以Tiles为例&#xff08;素材链接在文章最下方&#xff09; 修改素材属性。 将Sprite Mode属性改为Multiple多张&#xff08;不然切割不了&…...

现代的简洁,诠释轻奢的精致!福州中宅装饰,福州装修

轻奢风是一种生活新时尚 优雅、低调、舒适、简单&#xff0c;不断地推陈出新 站在时尚的前沿&#xff0c;引领潮流 中宅装饰集团轻奢风格产品 追求高品质生活细节 以设计精致的空间构造营造出 一种优雅、时尚生活氛围 将低调奢华之美注入现代家居设计中 客厅|The Sitt…...

运用ChatGPT辅助新手学习躺赢者PRO飞控二次开发示例(2023年10月28日)

运用ChatGPT辅助新手学习躺赢者PRO飞控二次开发示例&#xff08;2023年10月28日&#xff09; 1、以飞控预设的飞行任务demo中void flight_subtask_1(void)代码为例分析一下变量flight_subtask_cnt的作用&#xff1f; //逆时针转动90度&#xff0c;完成后降落 void flight_sub…...

【Java】HashCode方法重写注意事项

HashCode方法 HashCode方法是属于Object父类提供的方法&#xff0c;HashCode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点&#xff0c;例如&#xff0c;java.util.Hashtable提供的哈希表HashCode的常规协定是&#xff1a;在Java应用程序执行期间&#xff0c;在…...

039-第三代软件开发-PDF阅读器

第三代软件开发-PDF阅读器 文章目录 第三代软件开发-PDF阅读器项目介绍PDF阅读器1 初始化PDF view2 qml 中使用3 创建模块 关键字&#xff1a; Qt、 Qml、 pdf、 LTDev、 本地 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Met…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

DAY 45 超大力王爱学Python

来自超大力王的友情提示&#xff1a;在用tensordoard的时候一定一定要用绝对位置&#xff0c;例如&#xff1a;tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾&#xff1a; tensorboard的发展历史和原理tens…...