C/C++基础-结构体

指针函数与函数指针

结构体C和C++的区别

c中必须有typedef
例:typedef struct GifBean{
int current_frame;
int total_frame;
int *delays;
};
定义变量的时候 struct GifBean gifBean;

typedef struct GifBean{
int current_frame;
int total_frame;
int *delays;
}AA;
定义变量的时候 struct GifBean gifBean;
或者AA gifBean

typedef struct{
int current_frame;
int total_frame;
int *delays;
}AA;
定义变量的时候 AA gifBean

struct GifBean{
int current_frame;
int total_frame;
int *delays;
};
定义变量的时候 struct GifBean gifBean;
C++中如上的定义和C是一样的,不过C++可以不要typedef

struct GifBean{
int current_frame;
int total_frame;
int *delays;
};

GifBean gifBean;

struct GifBean{
int current_frame;
int total_frame;
int *delays;
}aa,bb,cc;

aa,bb,cc是定义的三个变量

编译流程:
预编译 对各种预处理命令进行处理gcc -E test.c -o test.i
编译 代码是否有语法错误,编译成汇编语言 gcc -S test.i -o test.s
汇编 把汇编代码文件生成二进制文件 gcc -c test.s -o test.o //-c gcc在生成机器码后停止
链接 就是将多个目标文件以及所需的库文件链接
生成可执行目标文件的过程 //gcc test.o -o test
./test
rm -rf test删除文件
直接编译成可执行文件 gcc -o test test.c
静态库:链接的时候已经把静态库拷贝到程序中以 .a结尾,执行不需要依赖静态库
更新发布比较麻烦

静态库的生成:

首先生成目标文件
gcc -c test.c -o test.o
使用ar命令将目标文件打包成静态库
ar rcs libtest.a test.o
r:表示更新或增加新文件
c: 创建一个库,不管是否存在
s:创建文档索引,加快编译时间
使用ar t libtest.a 查看静态库
动态库:动态库在链接阶段没有被复制到程序中,而是在程序运行中系统动态加载
系统只需载入一次动态库,不同的程序可以得到内存中相同动态库的副本
,因此节省了很多内存
静态库生成的过程;

首先生成目标文件
gcc -c test.c -o test.o
使用ar命令将目标文件打包成静态库
ar rcs libtool.a tool.o
链接静态库到main可执行文件
gcc -o main main.c -L. -ltool
./main 执行可执行文件

动态库生成的过程:
首先生成目标文件
gcc -c test.c -o test.o
生成动态库 创建与地址无关的代码 position independent code
gcc -shared -fPIC -o libtest.so test.o
编译可执行文件,链接动态库
gcc -o main main.c -L. -ltool//-l要链接的库 -L编译程序按照-L指定的路径去寻找库文件
//当动态库和静态库同名的时候,gcc会优先加载动态库
ls -lh 查看文件详情

ldd 查看可执行文件依赖了哪些库
vdso linux内核提供的虚拟so
libc.so 核心库
linux 下的动态库链接器
把当前目录设置到环境变量
LD_LIBRARY_PATH=. ./main //指定查找共享库,查找动态库除了默认路径以外的其他路径,报错的原因是他在系统的默认路径下找不到libtool.so,
因为我们没有把当前目录设置到系统环境变量中,所以报错

makefile 自动化编译脚本 告诉make命令如何编译

显示规则:
隐晦规则:比较简略的书写makefile
变量定义:变量都是字符串
文件指示:
注释:只有行注释 #

target 目标文件

prerequisites:依赖文件,即要生成哪个target所需要的文件或其他target

#!/bin/bash 引入 bin bash shell脚本第一行必须的

echo 输出一个变量

shell是弱语言

PWD 代表当前路径

shell 运行在linux系统上

shell 就是命令的集合

能独立的编译任意的第三方库,并将它打包到apk中

局部变量 系统环境变量(输入参数)

seq 系统脚本

expr命令 两数相加

$0 当前程序的名称
$n 程序的输入参数 n=1 第一个参数 n=2第二个参数
$* 所有的输入参数
$# 输入参数的个数
$? 命令执行的状态 一般返回0 代表成功 上一个命令是否执行成功


#!/bin/bash
i=0
while((i<100))
do
echo “数字 $i”
i=expr $i + 1
done

#!/bin/bash
i=0
while [[ $i -lt 100 ]]
do
echo “数字 $i”
i=expr $i + 1
done

读文件
#!/bin/bash
while read line
do
echo $line
done</root/file.txt

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为.a;
动态库是,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销,后缀为.so

Makefile描述了整个工程的编译、连接等规则哪些文件需要编译以及如何编译、需要创建哪些库文件以及如何创建这些库文件、
如何产生我们想要的可执行文件。使用Makefile,整个工程都可以完全自动化编译

实现C++与C及其它语言的混合编程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值