这个你要理解作用域的概念,看看书上怎么说的吧 |
ty86391101 发表于 2022-1-22 22:06
这是声明一个变量;
这是声明一个函数;
这是定义一个变量;
这是定义一个函数; 声明可以在任何用到的文件里面写,定义在整个工程里面只能写一次。 话已经说到这种程度还看不懂,我无能为力了。 |
发表于 2022-1-22 21:21 嗯,我的矛盾点在于 你看啊 tftled.h这个头文件里面 声明的 变量和函数 在main.c这个文件使用 包含了tftled.h头文件(include"tftled.h") 那么 我在main.c这个文件里面 想用tftled.c里的变量 这个需要声明extern int i;到这边我都是知道。 那main.c要去用tftled.c里的函数的时候 不也得是extern u8 sum();声明一下吗? 他不加extern 光声明u8 sum(u8 a,u8 b); 也能找到tftled.c里的函数。不得是extern u8 sum(u8 a,u8 b);吗? |
补充一下,可以在多个c文件里面定义static int i;但是每个文件里面的i都是自己文件的,你永远无法访问其他c文件里面的i,只能访问自己文件里面的那个。 |
ty86391101 发表于 2022-1-22 21:08 函数声明只是声明有这个东西,入口参数和出口参数都是什么样子的,当然可以每个c文件里面声明。 类似函数声明的变量的写法是定义,定义这个变量,比如int i;是定义i这个int型变量,你要在多个c文件里面定义,那么连接的时候,连接器就不知道该用哪个i,就乱套了。 extern int i;才是变量声明,声明其他c文件定义的i变量。 |
发表于 2022-1-22 19:27 是不是编译器默认的每个函数都是extern类型的啊? 所以函数不用加extern啊? |
不加extern是定义变量,一个名字的全局变量在工程里面只能定义一次。加了extern是声明变量,告诉c源码别的文件定义了一个什么类型的变量,当然可以在除了定义这个变量的c文件以外的任意c文件里面声明变量,不管用没用到。 函数原型声明,原理同上。所以不需要加extern。 |
188610329 发表于 2022-1-22 18:04 我修改一下哦,是没给写全 确实是别的函数去调用的 |
沙发正解![]() |
extern 是引用外部已经声明的变量 通常是在一个项目中引用另一个 C 文件声明的变量,所以理论上这个 .h 文件应该是被另一个 C文件 include 而不是被这个 C文件 include, 感觉上,这几个文件,被不同的人修改过,而修改的人也是半吊子。 |