第十二天C语言自学笔记

C语言多文件编程原理

 

一、C语言多个.c的编译原理

分工协作--分离

编译器 怎么分离.c的编译

对每个.c单独进行编译生成目标文件

对所有的目标文件进行链接组合

 

注:每个.c只关心语法是否正确,所有不认识的标签,都在编译时提前声明出来

 

输出.o文件:gcc -c -o main.o main.c

编译时:函数名--函数调用--进行特殊处理(main.c单独编译,里面有使用未在main.c中声明定义的函数)

C语言 = 函数的语言 各个功能用函数分离开,最后组合形成一个可执行文件

 

gcc 工具链: nm main.o -- 可查看编译时各个函数的相对地址,编译时可确定内存中的地址

解析.c,将.c里定义的函数 生成一个清单,同时函数里调用别的函数,只把函数名 作为一个标签这个U标签,最终要在链接时,确定每一个标签的绝对地址

 

链接:gcc -o build main.o x.o

 

同时编译链接:gcc -o build main.c x.c

 

 

二、多个点.c的常见编译错误

每个.c单独编译,所有.o和系统库、标准库一起组合

.c中,如果函数没有声明,编译不报错

 

常见错误:

1、undefined reference(未定义的标签) 其他模块要使用的函数,在最后链接时,没有具体实现的代码

2、multiple definition of getLen : 多个模块中,都实现了同一个函数,多模块链接时,这个标签有多个实现,链接器无法确定使用哪一个

 

 

三、分模块编程方法

一个模块: .c/.h .h时给自身和其他模块使用的

自身: .h 宏定义 结构体的声明 函数声明 (默认extern) 用extern修饰的全局变量

            .c 实现对外公布的函数

 

防止重复定义

#ifndef XXX_H

#define XXX_H

 

#endif  

 

对于全局变量 只能有一个名字

只能一个.c定义赋值,在这个模块的头文件内,用extern来声明这个全局变量,其余文件也能使用全局变量

 

static的作用:

1、修饰局部变量:将原保存在栈区的变量,申请保存在静态数据区,使得这个变量在函数返回后,继续常驻内存

比如统计函数被调用的次数

2、修饰全局变量:变量放置于数据区,但是作用于只在本文件有效

3、修饰函数:这个函数从全局有效,变为本文件有效

  • 29
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值