#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

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

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

相关文章

复合机器人:手脚眼脑的完美结合

在现代工业制造的舞台上&#xff0c;复合机器人如同一位精密而高效的工匠&#xff0c;以其独特的手脚眼脑&#xff0c;正深刻改变着传统的生产方式。这些机器人不仅仅是机械臂的简单延伸&#xff0c;它们汇聚了先进的机械结构、智能的感知系统、精密的控制技术和灵活的思维能力…

【CSAPP】-linklab实验

目录 实验目的与要求 实验原理与内容 实验步骤 实验设备与软件环境 实验过程与结果&#xff08;可贴图&#xff09; 实验总结 实验目的与要求 1.了解链接的基本概念和链接过程所要完成的任务。 2.理解ELF目标代码和目标代码文件的基本概念和基本构成 3.了解ELF可重定位目…

安全和加密常识(6)Base64编码方式

文章目录 什么是 Base64编码原理编解码示例应用什么是 Base64 Base64 是一种用于将二进制数据编码为仅包含64种ASCII字符的文本格式的编码方法,注意,它不是加密算法。它设计的目的主要是使二进制数据能够通过只支持文本的传输层(如电子邮件)进行传输。Base64常用于在需要处…

Python | 基于支持向量机(SVM)的图像分类案例

支持向量机&#xff08;SVM&#xff09;是一种监督机器学习算法&#xff0c;可用于分类和回归任务。在本文中&#xff0c;我们将重点关注使用SVM进行图像分类。 当计算机处理图像时&#xff0c;它将其视为二维像素阵列。数组的大小对应于图像的分辨率&#xff0c;例如&#xf…

三菱PLC标签使用(I/O的映射)与内容

今天&#xff0c;小编继续开始三菱PLC的学习&#xff0c;今天的内容是标签及其标签的内容说明&#xff0c;如果对你有帮助&#xff0c;欢迎评论收藏。 标签的种类&#xff0c;等级&#xff0c;定义 种类 三菱3U的PLC的种类分别为二种&#xff1a;全局标签与局部标签 全局标签…

RabbitMQ-交换机的类型以及流程图练习-01

自己的飞书文档:‌‍‬‍‬‍​‍‬​⁠‍​​​‌⁠​​‬‍​​​‬‬‌​‌‌​​&#xfeff;​​​​&#xfeff;‍​‍​‌&#xfeff;⁠‬&#xfeff;&#xfeff;&#xfeff;​RabbitMQ的流程图和作业 - 飞书云文档 (feishu.cn) 作业 图片一张 画rabbit-mq 消息发…

【HDC.2024】探索无限可能:华为云区块链+X,创新融合新篇章

6月23日&#xff0c;华为开发者大会2024&#xff08;HDC 2024&#xff09;期间&#xff0c; “「区块链X」多元行业场景下的创新应用”分论坛在东莞松山湖举行&#xff0c;区块链技术再次成为焦点。本次论坛以"区块链X"为主题&#xff0c;集结了行业专家、技术领袖、…

深入解读:如何解决微调扩散模型时微调数据集和训练数据集之间的差距过大问题?

Diffusion Models专栏文章汇总&#xff1a;入门与实战 前言&#xff1a;在微调扩散模型的时候经常会遇到微调数据集和训练数据集之间的差距过大&#xff0c;导致训练效果很差。在图像生成任务中并不明显&#xff0c;但是在视频生成任务中这个问题非常突出。这篇博客深入解读如何…

android应用的持续构建CI(一)-- 总体设计

一、背景 接下里我希望通过一系列的文章&#xff0c;把android应用的构建梳理一遍&#xff0c;从总体设计到逐个环节的实现。 总体设计jenkins集成手动签名依赖环境应用管理 二、构建流程图 三、技术组件 jenkinsjdkgradle360加固 既然是android应用的持续构建&#xff0c…

实验七 SQL数据更新和视图

题目 &#xff08;1&#xff09;向商品类别表category中插入一条记录&#xff08;801&#xff0c;‘座椅套’&#xff0c;‘各种品牌的汽车座套’&#xff09; &#xff08;2&#xff09;向商品表product中插入一条记录&#xff1a;商品编号80101&#xff0c;商品名称“四季通…

64.函数参数和指针变量

目录 一.函数参数 二.函数参数和指针变量 三.视频教程 一.函数参数 函数定义格式&#xff1a; 类型名 函数名(函数参数1,函数参数2...) {代码段 } 如&#xff1a; int sum(int x&#xff0c;int y) {return xy; } 函数参数的类型可以是普通类型&#xff0c;也可以是指针类…

文心一言 VS 讯飞星火 VS chatgpt (295)-- 算法导论21.4 4题

四、利用练习 21.4-2 &#xff0c;请给出一个简单的证明&#xff0c;证明在一个不相交集合森林上使用按秩合并策略而不使用路径压缩策略的运行时间为 O(m lgn) 。21.4-2 的内容是&#xff1a;“证明&#xff1a;每个结点的秩最多为 ⌊lgn⌋ 。”。如果要写代码&#xff0c;请用…

【C语言】auto 关键字

在C语言中&#xff0c;auto关键字用于声明局部变量&#xff0c;但它的使用已经变得很少见。事实上&#xff0c;从C99标准开始&#xff0c;auto关键字的默认行为就是隐含的&#xff0c;因此在大多数情况下无需显式使用它。 基本用法 在C语言中&#xff0c;auto关键字用于指定变…

CVPR 2024最佳论文:“神兵”的组合器 Generative Image Dynamics

CVPR 2024的最佳论文来自谷歌、美国加州大学圣迭戈分校。两篇都来至于视频生成领域&#xff0c;可见今年外界对视频生成领域关注度很高。今天的这篇是“Generative Image Dynamics”&#xff0c;Google Research发布的。它的研究成果令人震惊&#xff0c;从单张RGB图像生成连续…

DIY智能音箱:基于STM32的低成本解决方案 (附详细教程)

摘要: 本文详细介绍了基于STM32的智能音箱的设计与实现过程&#xff0c;包括硬件设计、软件架构、语音识别、音乐播放等关键技术。通过图文并茂的方式&#xff0c;结合Mermaid流程图和代码示例&#xff0c;帮助读者深入理解智能音箱的工作原理&#xff0c;并提供实际操作指导。…

一分钟教你设置代理服务器的IP地址

许多人购买完代理IP却不会使用&#xff0c;我们来学习一下如何手把手地设置代理服务器的IP地址。无论是为了访问受限网站还是保护隐私&#xff0c;设置代理IP都是一个非常实用的技能。让我们一起来看看怎么做吧&#xff01; 设置代理服务器的IP地址步骤 1. 选择代理服务提供商…

PyCharm左侧项目区域出现淡黄色背景如何解决

PyCharm左侧项目区域出现淡黄色背景如何解决 解决方法&#xff1a; 1、打开pycharm 文件 - > Setting-> 项目 -> 项目结构 2、添加内容根 为 你的项目根目录即可恢复

sql server启动、连接 与 navicat连接sql server

一、sql server 启动 1.搜索cmd->以管理员身份运行 2.输入以下命令 net start mssqlserver 3.服务器启动成功 二、sql server连接 1.打开ssms&#xff0c;输入&#xff0c;连接 2.右键&#xff0c;属性 3.连接&#xff0c;勾选允许远程连接到此服务器 三、navicat连接sq…

自然语言处理领域介绍及其发展历史

自然语言处理领域介绍及其发展历史 1 NLP2 主要任务3 主要的方法1 基于规则的方法&#xff08;1950-1980&#xff09;2 基于统计的方法&#xff08;传统的机器学习的方法&#xff09;3 Connectionist approach&#xff08;Neural networks&#xff09; 1 NLP 自动的理解人类语…

Labview_Occurrencel(事件发生)

PS&#xff1a;这里遇到 一个很Low的事情&#xff1a; 在停止第二个while循环的时候出现了停止不了的情况。因为等待事件发生设置的超时时间为:-1。所以等事件发生后出现了条件接线端已经执行的情况&#xff0c;所以当下次事件发生时未能及时停止。初版的停止设置如下图&#x…