stm32库文件 extern
请问,h文件中的变量和函数,被其他文件调用,不是要在extern吗为什么库文件外设h文件 都没有加extern 还能使用呢?不知道怎么解释
我自己百度过了,没有信服的解释,有大神指导下
具体情况具体分析,有时也跟编译器有关。
如果在调用时发现没有extern的话,有的编译器会报个警告,然后自己去找。
同样的道理也适用于#define toofree 发表于 2020-4-17 11:41
具体情况具体分析,有时也跟编译器有关。
如果在调用时发现没有extern的话,有的编译器会报个警告,然后自 ...
好吧,感谢回复。不过 缺点是 我本不想让其他文件调用的函数,能被其他文件调用了。 jtqwaszx 发表于 2020-4-17 12:46
好吧,感谢回复。不过 缺点是 我本不想让其他文件调用的函数,能被其他文件调用了。 ...
一般来说,把函数声明放在h文件中,把实现代码放在c文件中。如果你只是不想你的函数被其他地方调用,你可以把函数的声明和实现都写在c文件中。 我对于楼上两位不敢苟同,甚至觉得两位是误导,第一点:extern 一个其它文件里没有的变量或者是函数,都可以生效.
第二点可以解决你的问题,使用extern 就是多个文件统一一个已经定义过的函数或者变量,不需要include什么头文件,直接extern定义即可,源码一个变量或函数,可以被其它源码文件extern 引用,但是你不能定义,这是有区别的。 一般都是哪儿有错改哪儿 stm1024 发表于 2020-4-20 09:10
一般来说,把函数声明放在h文件中,把实现代码放在c文件中。如果你只是不想你的函数被其他地方调用,你可 ...
话是这样说 不假 lebment 发表于 2020-4-25 20:19
我对于楼上两位不敢苟同,甚至觉得两位是误导,第一点:extern 一个其它文件里没有的变量或者是函数,都可 ...
额 其实我不怎么赞同前两位的回复,不过你的解释 我硬是看了好几遍 没看懂个 关于你说的问题,我觉得有必要展开说明一下。有一个方式你可以试试,但是不能保证成功,取决于你的编译环境,我是在gcc下测试并通过的。
用一个简单的项目测试一下,这个是头文件:
//Func.h
#ifndef __FUNC_H_
#define __FUNC_H_
#include <stdio.h>
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 <stdio.h>
#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等,设置不同的访问限制。
jtqwaszx 发表于 2020-4-17 12:46
好吧,感谢回复。不过 缺点是 我本不想让其他文件调用的函数,能被其他文件调用了。 ...
如果不想要其它文件的函数调用到加个static不行吗?
页:
[1]