C理解(五):编译,链接库,宏,关键字,变量

news2024/11/24 20:04:04

编译

        编译过程
                文件.c->(预处理)->文件.i->(编译)->文件.S->(汇编)->文件.o->(链接)->elf程序

        预处理
                内容:加载头文件(#include),清除注释(//,./*),替换条件编译(#if #elif #endif    #ifdef),替换宏定义(#define)
                结果:生成.i文件(gcc -E xx.c -o xx.i)
                作用:用于debug调试
                注意:typedef定义由编译器处理

链接库

        静态链接库
                gcc x.c -o x.o -c
                只编译不连接,生成.o文件
                ar打包成 .a文件
                ar crs lib${func1}.a  ${func1}.o
                c创建库(不管是否存在)
                r库中插入模块
                s创建文件索引,创建较大库时候能加快时间
                编译:gcc x.c -o x -lx -L.
                nm查看.a文件中有哪些符号
                注意:gcc默认是动态库链接,-static强制静态链接指定链接(-lxxx),指定动态库地址(-L)

        动态链接库
                gcc x.c -o x.o -c -fPIC
                gcc -o libx.so aston.o -shared 
                -fPIC位置无关码
                -shared共享库方式链接
                指定环境变量LD_LIBRARY_PATH(动态链接库运行时需要被加载)
                编译:gcc test.c -o test -laston -L.

关键字

        static修饰局部变量,形成静态局部变量,静态局部变量分配在数据段/bss段
        register修饰变量会分配在寄存器,用于提升程序运行效率
        extern声明外部全局变量(变量初始化在其他文件)
        volatile变量不被被编译器改变
        void:p = NULL;  <=> p = (void *)0;即0地址处

        '\0','0',0,NULL
                '\0'是转义字符,ASCII编码值是0
                '0'是字符,ASCII编码值是48
                0是数字
                NULL是(void *)0

变量

        局部变量分配在栈上,作用域为代码块作用域,生命周期是临时的,连接属性为无连接,定义时未初始化则值随机,变量地址运行时在栈上随机分配地址
        静态局部变量,分配在数据段/bss段(初始化非0在数据段,初始化0或未初始化在bss段),作用域为代码块作用域,生命周期为永久,链接属性为无连接,静态局部变量<==>全局变量
        static使全局变量和函数链接属性由外部转为内部是为解决重名问题,宏和inline函数的链接属性为无连接

        宏定义
                最值:#define MAX(a,b) (((a)>(b))?(a):(b))
                一年有多少秒:#define SEC_PER_YEAR  (3652460*60UL)
                注意:类型默认int,超int类型范围(UL == unsigned int)

        带参宏,带参函数,inline
                宏定义在预处理期间处理,函数编译处理
                宏定义在调用处展开,函数在调用处跳转执行,执行完跳回
                宏定义原地展开,没有调用开销,函数是跳转执行再返回,有较大调用开销
                带参宏定义不检查参数类型,返回值不附带类型,函数有明确参数类型和返回值类型,调用函数编译会做参数类型检查
                函数体小适合用带参宏,函数体大用函数调用
                inline修饰的函数为内联函数,内联函数编译器做参数静态类型检查也不用调用开销而是原地展开

        debug宏
                #define DEBUG
                #ifdef DEBUG
                #define DBG(...) fprintf(stderr, " DBG(%s, %s(), %d): ", FILE, FUNCTION, LINE); fprintf(stderr, VA_ARGS)
                #else
                #define DBG(...)
                #endif


                __FILE__是预定义宏,在编译的c文件名
                __FUNCTION__是在编译的函数
                __LINE__是在编译的行号
                __VA_ARGS__表示一个或多个参数,类似可变参数中的省略号
                ...表示参数个数和类型是可变的,…为参数占位符


        内核DEBUG宏
                #ifdef DEBUG_S3C_MEM
                #define DEBUG(fmt, args...)   printk(fmt, ##args)
                #else
                #define DEBUG(fmt, args...)   do {} while (0)
                #endif

demo:

        debug宏

#include <stdio.h>

#define DEBUG
#ifdef DEBUG
#define DBG(...) fprintf(stderr, " DBG(%s, %s(), %d): ", __FILE__, __FUNCTION__, __LINE__); fprintf(stderr, __VA_ARGS__)
#else
#define DBG(...)
#endif

int main()
{
        DBG("test bug\n");
        return 27;
}

结果示例:

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

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

相关文章

[杂谈]-ESP32中的无线通信协议

ESP32中的无线通信协议 文章目录 ESP32中的无线通信协议1、ESP32 无线通信协议简介2、Bluetooth Low Energy (BLE)3、**Bluetooth Classic**4、**ESP-NOW**5、Wi-Fi&#xff08;客户端-服务器通信协议&#xff09;6、MQTT7、**LoRa**8、**GSM/GPRS/LTE**9、总结 ESP32是一个基于…

BL808学习日志-0-概念理解

一、主核心的介绍 1.三个核心在FREERTOS系统中相互独立&#xff0c;各负责各自的外设和程序&#xff1b;其中M0和LP核心在一个总线上&#xff0c;D0单独在一个总线上&#xff0c;两个总线使用AXI4.0(??)通讯&#xff1f; CPU0(M0)-E907架构&#xff0c;320MHz; CPU1(LP)-E9…

基于微信小程序的高校宿舍管理系统设计与实现(亮点:选择宿舍、宿舍评分、宿舍报修)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

【中秋节快乐】Matplotlib:3d绘图合集

目录 一、环境介绍 二、Matplotlib绘图&#xff08;3d&#xff09; 0. 设置中文字体 1. 3D线框图&#xff08;3D Wireframe Plot&#xff09; 2. 3D散点图&#xff08;3D Scatter Plot&#xff09; 3. 3D条形图&#xff08;3D Bar Plot&#xff09; 4. 3D曲面图&#xff0…

微信小游戏从零到上线系列文章整理,建议收藏

引言 本系列是《从零开始开发贪吃蛇小游戏到上线系列》&#xff0c;欢迎大家关注分享收藏订阅。 大家中秋快乐&#xff0c;我是亿元程序员&#xff0c;一位有着8年游戏行业经验的主程。前面笔者给大家讲解了微信小游戏如何从零到上线的流程。可能很多小伙伴都还没有看到。 本…

【深度学习_TensorFlow】卷积神经网络(CNN)

写在前面 这篇文章的行文思路如下&#xff1a; 先根据视频了解卷积和卷积神经网络的整体框架 接着了解卷积神经网络构建过程中的一些重要操作&#xff0c;包括内积、填充、池化。 然后介绍卷积层如何实现。 最后用卷积神经网络的开山之作&#xff08;LeNet-5&#xff09;来…

22 mysql range 查询

前言 这里主要是 探究一下 explain $sql 中各个 type 诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 以及 相关的差异 此系列文章建议从 mysql const 查询 开始看 测试表结构…

奶茶果饮外卖配送小程序商城的作用是什么

奶茶果饮商家众多&#xff0c;有加盟品牌也有独立自创品牌或小店等&#xff0c;奶茶果饮已经成为众多年轻人群体喜爱的饮品&#xff0c;在实际消费方面&#xff0c;普遍以到店外卖为主&#xff0c;市场需求较高&#xff0c;但同样的竞争压力也不小。 同行竞争激烈&#xff0c;…

【教学类-35-03】学号+姓名+班级(小3班)学号字帖(A4竖版2份)

图片展示: 背景需求: 本周排到小3班&#xff0c;还没有来得及设计小班主题活动书的内容&#xff0c;于是就把小2班的学号字帖微调一下&#xff0c;做一份竖版2份的学号字帖。 让幼儿熟悉自己的学号&#xff0c;让我也熟悉幼儿的名字和学号 材料准备&#xff1a; 描字写&#…

Excel 使用 ctrl + E 快捷键进行数据提取、合并、添加前后缀等操作

使用组合键【Ctrl E】&#xff0c;你可以对数据进行合并、数据提取、添加前后缀等操作。 合并 提取 加前后缀或单位

KNN(上):数据分析 | 数据挖掘 | 十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

day09_数组进阶

今日内容 零、 复习昨日 一、作业 二、引用类型[重要] 三、数组拷贝 四、数组扩容 五、数组排序[面试|笔试] 六、Arrays 零、 复习昨日 1数组创建后能否改变长度 不能 2数组创建后能否存储不同类型的数据 不能 √能,能默认转型的可以存储 double[] arr2 new double[3]; arr2[0…

TouchGFX之动态位图

标准位图会被编译到应用中&#xff0c;因此必须在编译时提供。在运行时间在RAM中创建位图&#xff0c;被称为动态位图。 动态位图的使用与编译到应用中的静态位图相同。 动态位图配置 必须先配置位图缓存&#xff0c;然后才能创建动态位图。 FrontendApplication.hpp#inclu…

基于PHP+MySQL的养老院管理系统

摘要 随着21世纪互联网时代的兴起&#xff0c;我们见证了人们生活方式的巨大改变。这个时代不仅深刻影响了我们的生活&#xff0c;还改变了我们对信息科学的看法。社会的各个领域都在不断发展&#xff0c;人们的思维也在不断进步&#xff0c;与此同时&#xff0c;信息的需求也与…

开具数电票如何减少认证频次?

“数电票”开具需多次刷脸认证&#xff0c;如何减少认证频次&#xff1f; 法定代表人、财务负责人可以在“身份认证频次设置”功能自行设置身份认证时间间隔&#xff0c;方法如下&#xff1a; 第一步 登录电子税务局。企业法定代表人或财务负责人通过手机APP“扫一扫”&#x…

jupyter notebook可以打开,但无法打开.ipynb文件,报错500 : Internal Server Error

1、错误信息 2、解决办法 打开Anaconda Promt界面&#xff0c;进入自己的虚拟环境。在命令行输入以下指令&#xff1a; pip install --upgrade nbconvert

全国排名前三的直播公司无锋科技入驻天府蜂巢成都直播产业基地

最近&#xff0c;全国排名前三的直播公司——无锋科技&#xff0c;正式宣布入驻位于成都的天府蜂巢直播产业基地&#xff0c;这一消息引起了业内人士的高度关注。成都直播产业基地一直是中国直播产业的重要地标之一&#xff0c;其强大的技术和资源优势为众多直播公司提供了广阔…

TouchGFX之二进制字体

将字体链接到应用的基本原则的主要优势是应用始终会自动包含应用中使用的更新文本和字体排印。 因此&#xff0c;使用起来十分容易和安全。 其缺点在于字体会使应用的体积变大。 为了缓解这个问题&#xff0c;TouchGFX允许应用使用二进制字体。 这些字体不链接到应用&#xff…

西北主要河流水系(绿洲)流域(山区)及高程分类数据集(一)

最近收集整理的了西北地区主要河流水系&#xff08;绿洲&#xff09;流域&#xff08;山区&#xff09;及高程分类数据&#xff0c;&#xff0c;本次主要是新疆的河流水系&#xff08;绿洲&#xff09;流域&#xff08;山区&#xff09;及高程分类数据&#xff08;矢量&#xf…

Mysql高级——数据库调优策略(1)

数据库其它调优策略 1. 数据库调优的措施 1.1 调优的目标 尽可能节省系统资源&#xff0c;以便系统可以提供更大负荷的服务。&#xff08;吞吐量更大&#xff09;合理的结构设计和参数调整&#xff0c;以提高用户操作响应的速度。&#xff08;响应速度更快&#xff09;减少系…