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、修饰函数:这个函数从全局有效,变为本文件有效
标签:全局变量,第十二天,函数,C语言,编译,模块,自学,main,链接 From: https://blog.csdn.net/m0_52001012/article/details/139364115