#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.mzph.cn/web/39377.shtml

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

相关文章

Java:JDK、JRE和JVM 三者关系

文章目录 一、JDK是什么二、JRE是什么三、JDK、JRE和JVM的关系 一、JDK是什么 JDK&#xff08;Java Development Kit&#xff09;&#xff1a;Java开发工具包 JRE&#xff1a;Java运行时环境开发工具&#xff1a;javac&#xff08;编译工具&#xff09;、java&#xff08;运行…

23432443

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

聚四氟乙烯消解管/PTFE四氟消化管/配套各厂家石墨消解仪

四氟消解瓶&#xff0c;通常指的是采用聚四氟乙烯&#xff08;PTFE&#xff0c;也称为特氟龙或铁氟龙&#xff09;材料制成的实验室消解容器。 以下是关于四氟消解瓶的一些基本信息&#xff1a; 材质特性&#xff1a; 四氟消解瓶由PTFE材料制成&#xff0c;具有极佳的耐腐蚀…

Python脚本:将Word文档转换为Excel文件

引言 在文档处理中&#xff0c;我们经常需要将Word文档中的内容转换成其他格式&#xff0c;如Excel&#xff0c;以便更好地进行数据分析和报告。针对这一需求&#xff0c;我编写了一个Python脚本&#xff0c;能够批量处理指定目录下的Word文档&#xff0c;将其内容结构化并转换…

PTrade如何获取技术值班?如get_RSI - 相对强弱指标;PTrade量化软件如何获取?

get_RSI - 相对强弱指标 get_RSI(close, n6) 使用场景 该函数仅在回测、交易模块可用 接口说明 获取相对强弱指标RSI指标的计算结果 PTrade是恒生公司开发的一款专业量化软件&#xff0c;部分合作券商可提供&#xff0c;↑↑↑&#xff01; 参数 close&#xff1a;价格…

.NET发布成单个文件后获取不到程序所在路径的问题

.net程序不发布成单个文件&#xff0c;所以运行都是正常的&#xff0c;但是发布成单个文件后发现使用&#xff1a; var basePath Path.GetDirectoryName((System.Reflection.Assembly.GetExecutingAssembly().Location)); 获取不到应用程序所在的路径了。 找一下几个获取本程…

从混乱到有序:企业级在线文档助力中小企业数字化转型的蜕变

在当今数字化浪潮下&#xff0c;企业的数字化转型已成为行业发展的必然趋势。他们数字化转型的痛点在哪里&#xff1f;资金有限、技术人才短缺和管理的复杂性等。很多时候&#xff0c;它们的文件管理比较混乱&#xff0c;大量的知识和数据分散在不同的系统&#xff0c;形成了数…

Web后端开发概述环境搭建项目创建servlet生命周期

Web开发概述 web开发指的就是网页向后再让发送请求,与后端程序进行交互 web后端(javaEE)程序需要运行在服务器中 这样前端才可以对其进行进行访问 什么是服务器? 解释1: 服务器就是一款软件,可以向其发送请求,服务器会做出一个响应.可以在服务器中部署文件&#xff0c;让…

MySQL:MySQL总结

文章目录 MySQL思维导图基础实际在 Innodb 存储引擎中&#xff0c;会用一个特殊的记录来标识最后一条记录&#xff0c;该特殊的记录的名字叫 supremum pseudo-record &#xff0c;所以扫描第二行的时候&#xff0c;也就扫描到了这个特殊记录的时候&#xff0c;会对该主键索引加…

OpenCV 张正友标定法(二)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 在之前的博客OpenCV 张氏标定法中,我们没有考虑镜头畸变等因素,因此计算出的内参与外参均是理想情况下的数值,而如果我们考虑到镜头的畸变: 我们就需要考虑使用最小二乘法最小化像素坐标的重投影误差(上述所求…

重温react-10(函数组件和类组件的ref获取方式)

App.js的代码 06是函数组件 07是类组件 import React, { useEffect, useRef } from react; import LearnFunction06 from ./LearnFunction06; // 函数组件和类组件的ref使用方式 import LearnFunction07 from ./LearnFunction07; // 函数组件和类组件的ref使用方式 export de…

dell服务器RAID5磁盘阵列出现故障的解决过程二——热备盘制作与坏盘替换过程

目录 背景方案概念全局热备&#xff08;Global Hot Spare&#xff09;&#xff1a;独立热备&#xff08;Dedicated Hot Spare&#xff09;&#xff1a; 过程8号制作成热备清除配置制作独立热备热备顶替坏盘直接rebuild 更换2号盘2号热备 注意注意事项foreign状态要先清除配置 背…

【Mac】Boxy SVG for Mac(矢量图编辑器)及同类型软件介绍

软件介绍 Boxy SVG 是一款功能强大的矢量图形编辑器&#xff0c;专门为 macOS 平台设计开发。它主要用于创建和编辑 SVG&#xff08;可缩放矢量图形&#xff09;文件&#xff0c;是设计师和开发者们制作矢量图形的理想工具。 以下是关于 Boxy SVG 的主要特点和功能&#xff1a…

Rural Access Index (RAI)农村通达指数

农村通达指数&#xff08;RAI&#xff09; 简介 农村通达指数&#xff08;RAI&#xff09;是全球交通领域最重要的发展指标之一。它是目前可持续发展目标中唯一一个直接衡量农村通达性的指标&#xff0c;通过评估农村人口的四季道路通达性来实现。在 2015 年作为可持续发展目…

路由LLM:优化模型调用的成本与效率

引言 在最近的一些视频和讨论中&#xff0c;我们经常提到使用较便宜和较快的模型来替代一些昂贵的大型语言模型&#xff08;LLM&#xff09;。这种方法的一个主要原因是看到许多人在不必要的场合调用如GPT-4或Claude Opus等高级模型&#xff0c;从而浪费了大量资金。而事实上&…

IDEA 编译单个Java文件

文章目录 一、class文件的生成位置二、编译单个文件编译项目报错Error:java: 无效的源发行版: 8 一、class文件的生成位置 file->project structure->Modules 二、编译单个文件 选中文件&#xff0c;点击recompile 编译项目报错 Error:java: 无效的源发行版: 8 Fi…

2024最新PyCharm安装教程(附激活码)

今天讲解的是PyCharm安装教程 一、软件简介 PyCharm是一款Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如&#xff0c; 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等。此外…

字符串和正则表达式踩坑

// 中石化加油卡号格式&#xff1a;以 100011 开头共19位public static final String ZHONGSHIYOU_OIL_CARD_PATTERN "^100011\\d{13}$";// 中石油加油卡号格式&#xff1a;以90、95、70开头共16位public static final String ZHONGYOU_OIL_CARD_PATTERN "^(9…

使用 urllib OpenSSL 时遇到的问题及解决

题意&#xff1a; ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1, currently the ssl module is compiled with LibreSSL 2.8.3 当前使用的 urllib3 版本&#xff08;v2.0&#xff09;仅支持 OpenSSL 1.1.1 或更高版本&#xff0c;但你的 Python 环境中的 ssl 模块…

安装opencv-python出错,怎么办?

安装opencv-python出错 解决方法&#xff1a; 具体版本号&#xff0c;python3.6对应的就是4.3.0.38 pip install opencv-python4.3.0.38 -i https://pypi.tuna.tsinghua.edu.cn/simple