你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32库文件 extern

[复制链接]
jtqwaszx 提问时间:2020-4-17 11:08 /
请问,h文件中的变量和函数,被其他文件调用,不是要在extern吗为什么库文件外设h文件 都没有加extern 还能使用呢?
不知道怎么解释

我自己百度过了,没有信服的解释,有大神指导下
收藏 评论9 发布时间:2020-4-17 11:08

举报

9个回答
七哥 回答时间:2020-4-17 11:41:37
具体情况具体分析,有时也跟编译器有关。
如果在调用时发现没有extern的话,有的编译器会报个警告,然后自己去找。
同样的道理也适用于#define

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

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

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

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

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

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

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

李康1202 回答时间:2020-4-26 14:08:14
一般都是哪儿有错改哪儿
jtqwaszx 回答时间:2020-4-29 13:26:45
stm1024 发表于 2020-4-20 09:10
一般来说,把函数声明放在h文件中,把实现代码放在c文件中。如果你只是不想你的函数被其他地方调用,你可 ...

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

额 其实我不怎么赞同前两位的回复,不过你的解释 我硬是看了好几遍 没看懂个
STM1024 回答时间:2020-4-30 11:52:31
关于你说的问题,我觉得有必要展开说明一下。有一个方式你可以试试,但是不能保证成功,取决于你的编译环境,我是在gcc下测试并通过的。

用一个简单的项目测试一下,这个是头文件:
  1. //Func.h
  2. #ifndef __FUNC_H_
  3. #define __FUNC_H_
  4. #include <stdio.h>
  5. void test1();
  6. void test3();
  7. #endif // __FUNC_H_
复制代码
这个是c文件:
  1. //Func.c
  2. #include "Func.h"

  3. //not declare in .h
  4. int foo=123;

  5. void test1()
  6. {
  7.     printf("test1\n");
  8. }

  9. //note: do not declare in .h
  10. static void test2()
  11. {
  12.     printf("test2\n");
  13. }

  14. void test3()
  15. {
  16.     printf("test3 call test2:");
  17.     test2();
  18. }
复制代码
在main函数所在的c文件中包含了Func.c的头文件:
  1. #include <stdio.h>
  2. #include "Func.h"
  3. extern int foo;
  4. int main()
  5. {
  6.     test1();
  7.     test3();
  8.     printf("%d\n",foo);
  9.     //test2();//will not compile
  10.     return 0;
  11. }
复制代码
上面的代码说明:
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等,设置不同的访问限制。

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

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

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版