#LinuxC高级 笔记二

makefile

gcc

gdb

makefile

1. 分文件编程

1.1 源文件:.c结尾的文件

包含main函数的.c

包含子函数的.c

1.2 头文件:.h结尾的文件

头文件、宏定义、typedef 、结构体、共用体、枚举、函数声明

include引用时“”和<>的区别:

<>去系统目录查找头文件

“”先从当前目录下查找,如果没有再去系统目录查找头文件。

位置查看:ctrl+鼠标点击stdio.h,退出alt+左或右箭头

系统默认搜索路径:/usr/include

2. 编译工具

gcc

1)预处理

展开头文件,删除注释,替换宏定义,不检查语法错误

gcc -E xx.c -io xx.i

  1. 编译

检查语法错误,有错就报错,没有问题就转换成汇编语言,生成汇编文件

gcc -S xx.i -o xx.s

3)汇编  将汇编文件转换成不可执行的二进制文件

gcc -c xx.s -o xx.o

4)链接 链接库文件 生成可执行的二进制文件

gcc xx.o -o xx

gcc xx.c --> ./a.out

gcc xx.c -o xx -->./xx

makefile:

gcc xx.o -o xx

gcc -c xx.c -o xx.o

gdb

gcc -g xx.c 生成 a.out

gdb a.out

r: 运行代码

l: 查看文件

b 行号:添加断点

info b:查看断点情况

d num(断点编号):删除断点

p 变量名:查看变量的值

s/n: 单步运行,s会进入子函数顺序执行;单步跳过,n不会进入子函数

c: 执行到下一个断点的位置

help:帮助

q: 退出

步骤:代码写好后,可以先通过gcc -g 进行编译,没有错误后可以通过gdb a.out进行调试

,输入l查看文件内容,通过b设置断点,输入r运行到断点,然后通过n或s可以进行单步调试,q退出

make

make:工程管理器

make工程管理器就是一个“自动编译管理器”这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件文件的内容来执行大量的编译工作。

  1. c 2.c 3.c 4.c 5.c

makefile:

gcc xx.o -o xx

gcc -c xx.c -o xx.o

3. 格式

目标:依赖

<Tab>命令

依赖(面粉)--->命令(加工)--->目标(馒头)

gcc xx.o -o xx 目标:xx 依赖:xx.o

gcc -c xx.c -o xx.o 目标:xx.o 依赖:xx.c

makefile的写法:

.PHONY:clean 避免生成同名文件

aa: 只有目标没有依赖,叫伪目标

运行程序:

make

./test

运行新增的功能:

make aa

也可以运行其他命令:

aa:

touch b.c

4. make管理多个文件

gcc -c main.c -o main.o 目标:main.o 依赖:main.c

gcc -c add.c -o add.o 目标:add.o 依赖:add.c

gcc main.o add.o -o sum 目标:sum 依赖:main.o add.o

5. makefile变量

自定义变量

自己定义的变量:一般用大写表示变量名,取变量的值用 $(变量名)

= 递归方式展开

:= 直接赋值(当前的值是什么就立即赋值)

+= 追加新的值

?= 判断之前是否定义,如果定义了,不重新赋值,否则赋值

预定义变量

RM 文件删除程序的名称,默认值为rm -f

CC C编译器的名称,默认值为cc。

CPP C预编译器的名称,默认值为$(CC) –E。

CFLAGS C编译器的选项,无默认值。

OBJS 生成的二进制文件或目标文件,自己定义

自动变量

$< 第一个依赖的名称

$@ 目标文件的完整名称

$^ 所有不重复的依赖文件,以空格分开

简化版Makefile写法:用 %.c 和 %.o 去替换所有的 .c 和 .o 文件

指针函数

本质是函数,返回值是指针

格式:

数据类型 * 函数名(形参)

{

函数体;

return 地址;//失败返回NULL

}

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

char *fun()

{

//char a[]="hello";//hello在栈区,函数调用结束,空间释放

//char *p="hello"; //hello存放在常量区

char *p=(char *)malloc(100);

strcpy(p,"hello"); //存放在堆区

return p;

}

int main(int argc, char const *argv[])

{

char *p=fun();

printf("%s\n",p);

free(p);

p=NULL;

return 0;

}

函数指针

本质是指针,指向函数

格式:

数据类型 (*指针名)(参数列表)

参数列表:和指向的函数参数列表一致

数据类型:和指向的函数返回值一致

#include<stdio.h>

int add(int a,int b)

{

return a+b;

}

int sub(int a,int b)

{

return a-b;

}

int test(int (*p)(int,int),int a,int b)

{

printf("%d\n",p(a,b));

return 0;

}

int main(int argc, char const *argv[])

{

// int (*p)(int,int);

// p=add;

// printf("%d\n",p(5,2));

// p=sub;

// printf("%d\n",p(5,2));

test(add,5,2);

test(sub,5,2);

return 0;

}

只需要一个test函数,可以实现不同的功能,这个特点叫"多态"

函数指针数组

本质是数组,存放函数指针

格式:

数据类型 (*数组名[元素个数])(参数列表)

int (*arr[2])(int,int)={函数名};

#include<stdio.h>

int add(int a,int b)

{

return a+b;

}

int sub(int a,int b)

{

return a-b;

}

int main(int argc, char const *argv[])

{

int (*arr[2])(int,int)={add,sub};

// arr[0]=add;arr[1]=sub;

for(int i=0;i<2;i++)

printf("%d \n",arr[i](5,3));

return 0;

}

  1. 封装函数实现求一个int类型数据的二进制有几位1

a) 一个整型数 //int a;

b) 一个指向整型的指针 //int *p=&a;

c)一个指向指针的指针,它指向的指针是一个指向一个整型数//int **q=&p;

d)一个有10个整型数的数组 //int a[10]

e)一个有10个指针的数组,该指针是指向一个整型数的 //int *a[10];

f)一个指向有10个整型数数组的指针//int (*p)[10]

g)一个指向函数的指针, 该函数有一个整型参数并返回一个整型数//int (*p)(int);

h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数

//int (*arr[10])(int)

条件编译

根据宏是否定义

#define 宏名

#ifdef 宏名

/*code1*/

#else

/*code2*/

#endif

执行顺序:判断宏名是否定义,如果定义就编译code1,否则编译code2

根据宏值

#define 宏名 值

#if 宏名

/*code1*/

#else

/*code2*/

#endif

执行顺序:判断宏的值是否为0,如果不为0编译code1,否则编译code2

防止头文件重复编译

放在头文件中:

#ifndef 宏名

#define 宏名

/*code*/

#endif

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JSON字符串中获取一个指定字段的值

一、方式一&#xff0c;引用gson工具 测试报文&#xff1a; {"account":"yanxiaosheng","password":"123456" } 引入pom <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --> <dependency><gr…

假设性文档嵌入 HyDE:大模型 + 对比学习,从关键词相似度搜索到语义搜索

假设性文档嵌入 HyDE&#xff1a;大模型 对比学习&#xff0c;从关键词相似度搜索到语义搜索 提出背景流程图解法拆解类比1. 单一文档嵌入空间的搜索2. 指令跟随型语言模型&#xff08;InstructLM&#xff09;的引入3. 生成文档的嵌入编码 提出背景 论文&#xff1a;https://…

保存huggingface缓存中AI模型(从本地加载AI模型数据)

在github下拉项目后,首次运行时会下拉一堆模型数据&#xff0c;默认是保存在缓存的&#xff0c;如果你的系统盘空间快满的时候就会被系统清理掉&#xff0c;每次运行又重新下拉一次&#xff0c;特别麻烦。 默认下载的缓存路径如下&#xff1a;C:\Users\用户名\.cache\huggingf…

【Unity性能消耗】ScriptableObject复用数据节省内存占用

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 专栏交流&#x1f9e7;&…

APP INVENTOR硬件交互学习教程05——自动连接蓝牙实现

每次打开手机APP&#xff0c;需要选择蓝牙&#xff0c;用起来很麻烦。有没有方法实现自动连接上次的地址呢&#xff0c;接下来请看吧&#xff01;1.界面设计增加了一个微数据库组件&#xff0c;借助它用来存储硬件地址 2.程序设计这里主要用两个方法&#xff0c;存储地址方法…

Python基础语法(与C++对比)(持续更新ing)

代码块 Python在统一缩进体系内&#xff0c;为同一代码块C{...}内部的为同一代码块 注释 Python 单行注释&#xff1a;#... 多行注释&#xff1a;... C 单行注释&#xff1a;//... 多行注释: /*...*/ 数据类型 1. Python数据类型 Python中支持数字之间使用下划线 _ 分割…

LVS+Nginx高可用集群--基础篇

1.集群概述 单体部署&#xff1a; 可以将上面内容分别部署在不同的服务器上。 单体架构的优点&#xff1a; 小团队成型就可完成开发&#xff0c;测试&#xff0c;上线 迭代周期短&#xff0c;速度快 打包方便&#xff0c;运维简单 单体架构的挑战&#xff1a;单节点宕机造成…

day03-numpy数据类型

numpy数据类型 名称描述名称描述bool_布尔型数据类型&#xff08;True 或者 False&#xff09;float_float64 类型的简写int_默认的整数类型&#xff08;类似于 C 语言中的 long&#xff0c;int32 或 int64&#xff09;float16/32/64半精度浮点数:1 个符号位&#xff0c;5 个指…

《ClipCap》论文笔记(上)

原文出处 [2111.09734] ClipCap: CLIP Prefix for Image Captioning (arxiv.org) 原文笔记 What ClipCap&#xff1a; CLIP Prefix for Image Captioning 一言以蔽之&#xff1a;使用 CLIP 编码作为标题的前缀&#xff0c;使用简单的映射网络&#xff0c;然后微调语言模型…

datawhale大模型应用开发夏令营学习笔记一

参考自 基于LangChainLLM的本地知识库问答&#xff1a;从企业单文档问答到批量文档问答datawhale的llm-universe 作者现在在datawhale夏令营的大模型应用开发这个班中&#xff0c;作为一个小白&#xff0c;为了能为团队做出一点贡献&#xff0c;现在就要开始学习怎么使用langch…

第二十条:与抽象类相比,优先选择接口

要定义多种实现的类型&#xff1a;JAVA有两种机制&#xff1a;接口和抽象类。这两种机制都支持为某些实例方法提供实现&#xff0c;但二者有个重要的区别&#xff1a;要实现由抽象类定义的类型&#xff0c;这个类必须是抽象类的子类。因为Java只允许单继承&#xff0c;对抽象类…

UE4_材质_材质节点_Fresnel

学习笔记&#xff0c;不喜勿喷&#xff0c;侵权立删&#xff0c;祝愿生活越来越好&#xff01; 一、问题导入 在创建电影或过场动画时&#xff0c;你常常需要想办法更好地突显角色或场景的轮廓。这时你需要用到一种光照技术&#xff0c;称为边沿光照或边缘光照&#xff0c;它的…

从硬件角度看Linux的内存管理

1. 分页机制 分段机制的地址映射颗粒度太大&#xff0c;以整个进程地址空间为单位的分配方式导致内存利用率不高。 分页机制把这个分配机制的单位继续细化为固定大小的页(Page)&#xff0c;进程的虚拟地址空间也按照页来分割&#xff0c;这样常用的数据和代码就可以以页为单位…

Angluar 实现pdf页面预览以及编辑

之前用过一个pdf预览的lib&#xff0c;并且还支持在线编辑&#xff0c;和直接下载编辑之后的pdf和直接打印&#xff0c;还不错&#xff0c;记录下 PdfShowcase 首先安装依赖 npm install ngx-extended-pdf-viewer 然后引入 import { NgxExtendedPdfViewerModule } from &q…

论文解读StyleGAN系列——StyleGANv1

论文&#xff1a;A Style-Based Generator Architecture for Generative Adversarial Networks&#xff08;2018.12&#xff09; 作者&#xff1a;Tero Karras, Samuli Laine, Timo Aila 链接&#xff1a;https://arxiv.org/abs/1812.04948 代码&#xff1a;https://github.com…

四、(3)补充beautifulsoup、re正则表达式、标签解析

四、&#xff08;3&#xff09;补充beautifulsoup、re正则表达式、标签解析 beautifulsoupre正则表达式正则提取标签解析 beautifulsoup 补充关于解析的知识 还需要看爬虫课件 如何定位文本或者标签&#xff0c;是整个爬虫中非常重要的能力 无论find_all&#xff08;&#xff…

AI一键音频转文字工具 速度超快,支持实时转换,无需联网,本地整合包下载

这是 CapsWriter-Offline &#xff0c;一个 PC 端的语音输入、字幕转录工具。可用实现简单一键将音频文件转换成文字的懒人工具。 两个功能&#xff1a; 1、实时转换&#xff0c;按下键盘上的 大写锁定键&#xff0c;录音开始&#xff0c;当松开 大写锁定键 时&#xff0c;就会…

企商在线出席2024全球数字经济大会城市副中心论坛

2024年7月3日&#xff0c;2024全球数字经济大会城市副中心论坛“数字基础设施绿色创新发展分论坛”在北京市通州区成功举办。企商在线产品及解决方案总监孙杰受邀出席本次会议&#xff0c;并参与圆桌对话环节&#xff0c;分享“绿色”发展思路与经验。 2024全球数字经济大会城市…

一篇文章说清楚Filter(过滤器)、Interceptor(拦截器)和AOP(切面儿)

文章目录 前言一、Filter&#xff08;过滤器&#xff09;1.说明2.实现filterChain.doFilter() 3.order优先级4.解决跨域5.拦截返回错误信息JSON 二、Interceptor&#xff08;拦截器&#xff09;1.说明2.实现preHandlepostHandleafterCompletion 3.执行顺序图4.排除特定路径拦截…

@react-google-maps/api实现谷歌地图中添加多边围栏,并可编辑,编辑后可获得围栏各个点的经纬度

先上一张效果图 看看是不是大家想要的效果&#xff5e; ❤️ 由于该功能微微复杂一点&#xff0c;为了让大家精准了解 我精简了一下地图代码 大家根据自己的需求将center值和paths&#xff0c;用setState做活就可以了 1.第一步要加入项目package.json中或者直接yarn install它…