c语言函数定义、函数声明、函数调用以及extern跨文件的变量引用
引用:https://www.yii666.com/article/519100.html
函数或参数无非三种表达形式:声明、定义、引用。
- 如果没有定义,只有声明和调用:编译时会报连接错误。undefined reference to `func_in_a'
- 如果没有声明,只有定义和调用:编译时一般会报警告,极少数情况下不会报警告。但是最好加上声明。
- 如果没有调用,只有定义和声明:编译时一般会报警告(有一个函数没有使用),有时不会报警告。这时候程序执行不会出错,只是你白白的写了几个函数,而没有使用浪费掉了而已。
重复定义/声明: 在一个项目的两个.c文件中,分别定义一个名字相同的函数。 编译报错 multiple definition of `func_in_a'
重复定义会导致编译器难以判断调用的函数是哪一个,编译器在调用函数时是根据函数名来识别不同的函数的。
我只在b.c中声明变量,但是别的文件中根本就定义这个变量,会怎么样? 答案是编译报错(连接错误)undefined reference to `g_b'
跨文件调用变量或函数:
如果调用函数,1. 引用该文件的 “.h” 文件。 2.在文件中用 “extern” 修饰调用的函数。
如果调用变量:1. 在变量定义的函数 a.c 内定义一个函数引用该变量,然后在 b.c内声明该函数,并调用。 2. 在文件中 extern 修饰该变量 (简单方便,节约编译时间)
在一个程序里面,一个函数可以定义一次,引用可以有无数次,声明可以有无数次。因为函数定义或者变量的定义实际上是创造了这个函数/变量,所以只能有一次。(多次创造同名的变量会造成变量名重复,冲突;多次创造同名的函数也会造成函数名重名冲突)。声明是告诉编译器变量/函数的原型,在每个引用了这个全局变量/函数的文件之前都要声明该变量/函数
局部变量能不能跨文件使用? 不能。因为局部变量属于代码块作用域。他的作用域只有他定义的那个函数内部。
静态局部变量能不能跨文件使用? 不能。因为本质上还是个局部变量。
讨论跨文件使用问题,只用讨论全局变量和函数就可以了
extern 引用基本类型的变量或函数时,不需要在“.c”文件中包含“.h”头文件,但是如果引用的是复合型的变量:结构体或enum类型的变量时,需要引用,且该变量未全局变量
结构体声明是不能被extern引用的。
/*********** ERROR **************/ // *.h struct str{ int a; int b; }; struct str str1 = {0,1}; // .c 文件引用 extern struct str str1;
/*********** SUCCESS **************/ // *.h typedef struct{ int a; int b; }str; str str1 = {0,1}; // .c 文件引用 extern struct str str1;