久芯网

stm32库文件 extern

avatar jtqwaszx 提问时间: 2023-10-04 10:33:45 / 未解决
请问,h文件中的变量和函数,被其他文件调用,不是要在extern吗为什么库文件外设h文件 都没有加extern 还能使用呢?
不知道怎么解释

我自己百度过了,没有信服的解释,有大神指导下

如需获得 stm32 等器件的更多信息,请点击链接或 点击此处 联系在线客服!

9个回答
  • avatar 七哥
    回答时间: 2023-10-04 10:51:42

    具体情况具体分析,有时也跟编译器有关。 如果在调用时发现没有extern的话,有的编译器会报个警告,然后自己去找。 同样的道理也适用于#define

  • avatar jtqwaszx
    回答时间: 2023-10-04 11:18:26
    toofree 发表于 2020-4-17 11:41
    具体情况具体分析,有时也跟编译器有关。 如果在调用时发现没有extern的话,有的编译器会报个警告,然后自 ...

    好吧,感谢回复。不过 缺点是 我本不想让其他文件调用的函数,能被其他文件调用了。

  • avatar STM1024
    回答时间: 2023-10-04 11:36:34
    jtqwaszx 发表于 2020-4-17 12:46
    好吧,感谢回复。不过 缺点是 我本不想让其他文件调用的函数,能被其他文件调用了。 ...

    一般来说,把函数声明放在h文件中,把实现代码放在c文件中。如果你只是不想你的函数被其他地方调用,你可以把函数的声明和实现都写在c文件中。

  • avatar lebment
    回答时间: 2023-10-04 11:54:09

    我对于楼上两位不敢苟同,甚至觉得两位是误导,第一点:extern 一个其它文件里没有的变量或者是函数,都可以生效. 第二点可以解决你的问题,使用extern 就是多个文件统一一个已经定义过的函数或者变量,不需要include什么头文件,直接extern定义即可,源码一个变量或函数,可以被其它源码文件extern 引用,但是你不能定义,这是有区别的。

  • avatar 李康1202
    回答时间: 2023-10-04 12:20:09

    一般都是哪儿有错改哪儿

  • avatar jtqwaszx
    回答时间: 2023-10-04 12:43:02
    stm1024 发表于 2020-4-20 09:10
    一般来说,把函数声明放在h文件中,把实现代码放在c文件中。如果你只是不想你的函数被其他地方调用,你可 ...

    话是这样说 不假

  • avatar jtqwaszx
    回答时间: 2023-10-04 13:08:18
    lebment 发表于 2020-4-25 20:19
    我对于楼上两位不敢苟同,甚至觉得两位是误导,第一点:extern 一个其它文件里没有的变量或者是函数,都可 ...

    额 其实我不怎么赞同前两位的回复,不过你的解释 我硬是看了好几遍 没看懂个

  • avatar STM1024
    回答时间: 2023-10-04 13:31:00

    关于你说的问题,我觉得有必要展开说明一下。有一个方式你可以试试,但是不能保证成功,取决于你的编译环境,我是在gcc下测试并通过的。 用一个简单的项目测试一下,这个是头文件: //Func.h #ifndef __FUNC_H_ #define __FUNC_H_ #include void test1(); void test3(); #endif // __FUNC_H_ 复制代码 这个是c文件: //Func.c #include "Func.h" //not declare in .h int foo=123; void test1() { printf("test1\n"); } //note: do not declare in .h static void test2() { printf("test2\n"); } void test3() { printf("test3 call test2:"); test2(); } 复制代码 在main函数所在的c文件中包含了Func.c的头文件: #include #include "Func.h" extern int foo; int main() { test1(); test3(); printf("%d\n",foo); //test2();//will not compile return 0; }复制代码 上面的代码说明: 1. 如果不使用extern int foo; 则代码无法编译通过,在main函数中不能直接使用foo,达到了部分隐藏的功能,不过别人想要用你的变量foo,一个extern还是能够使用,无论你是放在头文件还是c文件中,都没辙。 2. main函数中直接调用test2,编译器不会通过编译,显示undefine reference,起到了隐藏的效果,即使你在main所在的c文件中,试图通过extern static void test2();也无法通过编译。 3. 此外,在test3的实现中,又可以调用test2函数,test2函数像是Func下的私有函数。 这是目前能达到的效果,C还无法像C++的类定义那样,使用private/protected/public等,设置不同的访问限制。

  • avatar a316363723
    回答时间: 2023-10-04 13:48:35
    jtqwaszx 发表于 2020-4-17 12:46
    好吧,感谢回复。不过 缺点是 我本不想让其他文件调用的函数,能被其他文件调用了。 ...

    如果不想要其它文件的函数调用到加个static不行吗?

会员中心 微信客服
客服
回到顶部