打印
[STM32F1]

小弟请问一个关于C语言.h文件的问题~~~

[复制链接]
1127|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liuchang890811|  楼主 | 2015-8-17 11:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请原谅小弟没有积分~~~
这个问题困扰我很久时间,终于憋不住了~~~
小弟不知道这里为什么这里使用extern和不使用extern都行,这是为什么呢?
adc.c文件
void adc_Init(void)
{
~~~
}
adc.h文件
{
#ifndef ADC_H
#define ADC_H
void adc_Init(void);/* 请问大神:这里使用void adc_Init(void);和extern void adc_Init(void);都行,为什么??? */
#endif

在main.c文件中需要调用这个函数
#inlcude "adc.h"
{
adc_Init();
}
沙发
hbzjt2011| | 2015-8-17 11:26 | 只看该作者
首先你要明白extern的意义,extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其它模块中寻找其定义。

使用特权

评论回复
板凳
huarana| | 2015-8-17 11:30 | 只看该作者
hbzjt2011 发表于 2015-8-17 11:26
首先你要明白extern的意义,extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译 ...

按照c标准,要使用不在当前文件下定义的函数或者变量的时候要加 extern

不过,某些编译器比较灵活点  (比如pic的,不加也可以用)

使用特权

评论回复
地板
hbzjt2011| | 2015-8-17 11:33 | 只看该作者
huarana 发表于 2015-8-17 11:30
按照c标准,要使用不在当前文件下定义的函数或者变量的时候要加 extern

不过,某些编译器比较灵活点  ( ...

恩,有可能编译器不同要求也不一样,如果使用多个h文件时,最好加上

使用特权

评论回复
5
liuchang890811|  楼主 | 2015-8-17 12:52 | 只看该作者
我使用的是Keil MDK4.7
我很好奇,也很疑惑
按照小弟的理解:这里应该加上extern才对,否则是不是可以算是重复定义???

使用特权

评论回复
6
mmuuss586| | 2015-8-17 13:43 | 只看该作者
你添加了这个头文件,就可以不加EXTERN

使用特权

评论回复
7
hbzjt2011| | 2015-8-17 13:44 | 只看该作者
liuchang890811 发表于 2015-8-17 12:52
我使用的是Keil MDK4.7
我很好奇,也很疑惑
按照小弟的理解:这里应该加上extern才对,否则是不是可以算是重复 ...

要是只有一个.c和一个.h不用加,因为在源文件包含时这相当于函数原型声明。如果有其他源文件,就要加了

使用特权

评论回复
8
liuchang890811|  楼主 | 2015-8-17 14:40 | 只看该作者
那我如果我在其它文件,例如main.c中想调用void ADC_Init()这个函数
我添加adc.h头文件,请问大神:
adc.h文件
{
#ifndef ADC_H
#define ADC_H          /* 我应该使用哪个?为什么? */
void adc_Init(void);   /* 如果使用这个:算不算重复定义?还是用该理解成申明?(我看开发板的程序大多采用这种写法) */
extern adc_Init(void):/* 按照小弟的理解,应该这样写,告诉编译器我这个函数在别的文件中定义的,这里只是引用~~~,这样理解对吗??? */
#endif

使用特权

评论回复
9
1021256354| | 2015-8-17 15:16 | 只看该作者
。c文件中申明的时候已经有extern了

使用特权

评论回复
10
Xflyan| | 2015-8-17 15:53 | 只看该作者
C标准里函数声明默认都是外部(extern可以不加)的,也就是只要在当前调用之前做了声明,就可以用,不管函数实体在哪个文件。
加 extern 可以方便自己查阅时知道该函数外部的,不是在本文件内定义的
int main(void)
{
void ADC_Init(void);/// 假设实体在 ADC.C文件内
    ADC_Init();
}

使用特权

评论回复
11
diweo| | 2015-8-17 16:04 | 只看该作者
本帖最后由 diweo 于 2015-8-17 16:05 编辑
liuchang890811 发表于 2015-8-17 12:52
我使用的是Keil MDK4.7
我很好奇,也很疑惑
按照小弟的理解:这里应该加上extern才对,否则是不是可以算是重复 ...

int a;声明并且定义了一个变量,
extern int a;仅声明变量,在别的地方可以定义也可以不定义

void func();仅声明一个函数,注意这里是分号结尾

void func()
{。。。
}          声明并定义一个函数。注意这里是大括号对

正常来说都是在.h文件里声明函数,在.c文件里定义函数。
即使同一个.h文件被多个.c文件include,也没关系,因为include的只是声明。
如果在.h文件里面是函数定义,那就不能被多个.c文件include了。

使用特权

评论回复
12
desertsailor| | 2015-8-17 20:07 | 只看该作者
如果要调用这个函数的文件已经包含了.h文件,则不需要EXTERN

使用特权

评论回复
13
liuchang890811|  楼主 | 2015-8-18 11:28 | 只看该作者
华虹MCU 发表于 2015-8-18 09:23
extern是对声明来说的,C编译器默认认为你声明为extern函数。就是说不加extern或static的 void fun(void) ...

这位大神解释最透彻,最清晰,拜读了~~~

使用特权

评论回复
14
稳稳の幸福| | 2015-8-18 11:31 | 只看该作者
extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

87

帖子

0

粉丝