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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版