jtqwaszx 发表于 2020-4-17 11:08:15

stm32库文件 extern

请问,h文件中的变量和函数,被其他文件调用,不是要在extern吗为什么库文件外设h文件 都没有加extern 还能使用呢?
不知道怎么解释

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

toofree 发表于 2020-4-17 11:41:37

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

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文件中。

lebment 发表于 2020-4-25 20:19:15

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

likang1202 发表于 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下测试并通过的。

用一个简单的项目测试一下,这个是头文件:
//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等,设置不同的访问限制。

a316363723 发表于 2020-4-30 19:10:45

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

如果不想要其它文件的函数调用到加个static不行吗?
页: [1]
查看完整版本: stm32库文件 extern