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

news2024/11/17 9:35:02

声明与定义分离

声明:将声明单独封装成一个以.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

        

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

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

相关文章

【MATLAB源码-第63期】基于matlab的DCSK(差分混沌移位键控调制)系统误码率仿真。

MATLAB 2022a 1、算法描述 DCSK&#xff08;Differential Chaos Shift Keying&#xff09;是一种差分混沌移位键控调制方式&#xff0c;常用于无线通信系统。其调制和解调的基本流程如下&#xff1a; 1. DCSK调制 1.1 生成混沌序列 - 初始条件&#xff1a;选择一个混沌映射&a…

[论文笔记]RetroMAE

引言 RetroMAE,中文题目为 通过掩码自编码器预训练面向检索的语言模型。 尽管现在已经在许多重要的自然语言处理任务上进行了预训练,但对于密集检索来说,仍然需要探索有效的预训练策略。 本篇工作,作者提出RetroMAE,一个新的基于掩码自编码器(Masked Auto-Encoder,MAE)…

rate-based 借贷式拥塞控制算法

有没有一种 rate-based 算法可以不测量 delivery rate&#xff0c;当然有&#xff01;直接套在 AIMD 上就行&#xff0c;虽然套在 bbr 上没什么不可。 传统 AIMD 拥塞控制代价很大&#xff0c;代价源自两点&#xff0c;首先&#xff0c;AI 有填 buffer 的趋势&#xff0c;其次…

四十二、【进阶】

目录 1、覆盖索引 2、案例分析 &#xff08;1&#xff09;select * 查询 &#xff08;2&#xff09;使用字段查询 &#xff08;3&#xff09;性能差异原因 3、分析 &#xff08;1&#xff09;主键id查询 &#xff08;2&#xff09;覆盖索引 1、覆盖索引 简单点说&#x…

【MySQL索引与优化篇】索引优化与查询优化

索引优化与查询优化 文章目录 索引优化与查询优化1. 概述2. 索引失效案例3. 关联查询优化3.1 Join语句原理3.2 Simple Nested-Loop Join&#xff08;简单嵌套循环连接&#xff09;3.3 Index Nested-Loop Join&#xff08;索引嵌套循环连接&#xff09;3.4 Block Nested-Loop Jo…

发布不到一月的4+经典单细胞+预后模型生信思路,可复现可升级

今天给同学们分享一篇单细胞预后模型的生信文章“Integrating single-cell and bulk RNA sequencing to predict prognosis and immunotherapy response in prostate cancer”&#xff0c;这篇文章于2023年9月20日发表在Scientific Reports期刊上&#xff0c;影响因子为4.6。 前…

数藏平台纷纷停运 用户手中数字藏品成了一张图

2021年8月2日&#xff0c;腾讯上线幻核数藏平台&#xff0c;随后QQ音乐、腾讯动漫、腾讯视频、腾讯新闻、起点读书等腾讯系应用都植入了数字藏品板块&#xff0c;强势进入国内数藏市场。国内数藏市场也迎来了起飞时刻。2022年底&#xff0c;数藏市场进入寒冬&#xff0c;曾经人…

数字展厅搭建平台要具备哪些功能,如何选择数字展厅搭建平台

引言: 数字展厅搭建平什台是现代营销中不可或缺的重要工具之一。它可以帮助企业打造个性化、多媒体、互动性强的展示空间&#xff0c;吸引、引导和留住目标用户。在选择数字展厅搭建平台时&#xff0c;我们需要考虑各方面的功能和性能&#xff0c;以确保能够满足企业的需求并取…

建筑模板材质-不同材质建筑模板优缺点分析

建筑模板是施工过程中不可或缺的重要材料&#xff0c;不同材质的建筑模板各有其优缺点。在众多材质中&#xff0c;广西桉木芯建筑模板以其独特的性能和优势备受青睐&#xff0c;下面将从不同材质的建筑模板入手&#xff0c;重点推荐广西桉木芯建筑模板。一、胶合板建筑模板胶合…

前端小程序 实现文字加载效果 文字跳动

效果 主要看充电中...的效果 ![1 实现 <view v-else class"status-working"><text class"letter letter1">充</text><text class"letter letter2">电</text><text class"letter letter3">中&l…

二十二、Arcpy批量波段组合——结合Landat数据城市建成区提取

一、前言 其实波段组合和GIS中栅格计算有点类似,实质上就是对每个像素点对应的DN值进行数学计算,也就是可以进行运算表达式是三个或多个变量相加、相减……每一个变量对应于一个图像数据,对这三个或多个图像数据求值并输出结果图像。 二、具体操作 1、实验具体目标 将202…

Android WMS——WMS窗口添加(十)

Android 的 WMS&#xff08;Window Manager Service&#xff09;是一个关键组件&#xff0c;负责管理窗口的创建、显示、布局和交互等。Window 的操作有两大部分&#xff0c;一部分是 WindowManager 来处理&#xff0c;一部分是 WMS 来处理&#xff0c;如下图所示&#xff1a; …

验收测试的关键步骤是怎样的?

验收测试是项目管理中的一个关键步骤&#xff0c;旨在确保项目交付物(通常是软件、产品或服务)符合预期的质量标准和需求。这个过程有助于验证项目的可交付成果是否满足客户或利益相关者的期望&#xff0c;同时也为项目团队提供了机会来修复可能存在的问题和改进之前的工作。 一…

一个方法,教你快速监测蓄电池!

随着电力需求的不断增长和可再生能源的快速发展&#xff0c;蓄电池技术已经成为能源存储领域的重要组成部分。 蓄电池不仅在家庭和工业应用中发挥着重要作用&#xff0c;还在电网稳定性和可持续能源集成方面具有关键地位。然而&#xff0c;蓄电池的有效监控和管理对于确保其可靠…

【Qt控件之QMessageBox】详解

Qt控件之QMessageBox 描述基于属性的API富文本和文本格式属性严重程度以及图标和Pixmap属性静态函数API 高级用法默认按钮和退出按钮示例使用场景 描述 QMessageBox类提供了一个模态对话框&#xff0c;用于通知用户或向用户提问并接收答案。 消息框显示一个主要文本以提醒用户…

软件测试 —— 冒烟测试(Smoke Test,ST)

1. 核心 冒烟测试就是完成一个新版本的开发后&#xff0c;对该版本最基本的功能进行测试&#xff0c;保证基本的功能和流程能走通。 如果不通过&#xff0c;则打回开发那边重新开发&#xff1b; 如果通过测试&#xff0c;才会进行下一步的测试(功能测试&#xff0c;集成测试&a…

SQLyog连接数据库报plugin caching_sha2_password could not be loaded......解决方案

问题描述 问题分析 因为MySQL新版默认使用caching_sha2_password作为身份验证的插件&#xff0c;而旧版本使用的是mysql_native_password。当出现plugin caching_sha2_password could not be loaded报错&#xff0c;我们更换为旧版本 如何解决 先使用cmd命令登录MySQL&a…

从零开始的LINUX(四)

1.yum&#xff1a; 功能&#xff1a;软件包管理器&#xff0c;功能类似与手机上的应用商店。通过yum可以获取指令的下载地址&#xff0c;然后一键式安装指令。由于yum中的地址一般都是外网的&#xff0c;所以需要镜像源&#xff08;即国内的下载地址&#xff09;。 相关指令&…

2023最网最全软件测试基础知识【建议收藏】

​对于一个软件来说&#xff0c;总会存在各种各样的软件缺陷。因此我们需要通过软件测试来检查软件中存在的各种问题。 在下面的这篇文章中&#xff0c;将讲解软件测试的基础知识&#xff0c;让我们一起来了解一下吧 一、 软件缺陷的概述 1、什么是软件缺陷 ​ 软件缺陷就是…

博弈论学习笔记(3)——完全信息动态博弈

前言 在这个部分&#xff0c;我们学习的是完全信息动态博弈。主要内容包括扩展式博弈、子博弈精炼Nash均衡、重复博弈和子博弈精炼Nash均衡的应用。 一、扩展式博弈 1、扩展式博弈 1&#xff09;扩展式博弈是什么 扩展式博弈是博弈问题的一种规范性描述&#xff0c;扩展式博…