野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9086|回复: 5

STM32初学者关于函数作用域的一个疑问

[复制链接]
发表于 2016-3-11 17:09:30 | 显示全部楼层 |阅读模式
      之前写程序,一个工程有多个C文件的话,假如主文件用到其它文件中的函数,会在程序开始的位置写一句
      extern void fun();             //之类的
      告诉编译器,这个函数是存在的。但是看火哥的程序,里面基本没有用extern,只是在头文件里面做了一下声明,但是程序都能用,所以很疑惑,希望哪位高手解答一下,谢谢了!

回复

使用道具 举报

发表于 2016-3-11 17:53:59 | 显示全部楼层
extern void fun();             //之类的就是声明

头文件里有声明,在其它文件中使用include头文件,就把这些声明都放入c文件了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-14 14:57:11 | 显示全部楼层
flyleaf 发表于 2016-3-11 17:53
extern void fun();             //之类的就是声明

头文件里有声明,在其它文件中使用include头文件,就 ...

关键就是这个extern,我没有找到。举个例子,比如火哥库函数驱动流水灯的那个例程,bsp_led.c里面的代码是
#include "bsp_led.h"   

/**
  * @brief  初始化控制LED的IO
  * @param  无
  * @retval 无
  */
void LED_GPIO_Config(void)
{               
                /*定义一个GPIO_InitTypeDef类型的结构体*/
                GPIO_InitTypeDef GPIO_InitStructure;

                /*开启LED的外设时钟*/
                RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);

                /*选择要控制的GPIOB引脚*/                                                                                                                          
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;       

                /*设置引脚模式为通用推挽输出*/
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

                /*设置引脚速率为50MHz */   
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

                /*调用库函数,初始化GPIOB0*/
                GPIO_Init(GPIOB, &GPIO_InitStructure);       
               
                /*选择要控制的引脚*/                                                                                                                          
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
       
                GPIO_Init(GPIOC, &GPIO_InitStructure);

                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
       
                GPIO_Init(GPIOC, &GPIO_InitStructure);       
                  

                /* 关闭所有led灯        */
                GPIO_SetBits(GPIOB, GPIO_Pin_0);
               
                /* 关闭所有led灯        */
                GPIO_SetBits(GPIOC, GPIO_Pin_4|GPIO_Pin_3);         
}
/*********************************************END OF FILE**********************/
bsp_led.h里面的代码是
#ifndef __LED_H
#define        __LED_H

#include "stm32f10x.h"

/** the macro definition to trigger the led on or off
  * 1 - off
  *0 - on
  */
#define ON  0
#define OFF 1

/* 带参宏,可以像内联函数一样使用 */
#define LED1(a)        if (a)        \
                                        GPIO_SetBits(GPIOB,GPIO_Pin_0);\
                                        else                \
                                        GPIO_ResetBits(GPIOB,GPIO_Pin_0)

#define LED2(a)        if (a)        \
                                        GPIO_SetBits(GPIOC,GPIO_Pin_4);\
                                        else                \
                                        GPIO_ResetBits(GPIOC,GPIO_Pin_4)

#define LED3(a)        if (a)        \
                                        GPIO_SetBits(GPIOC,GPIO_Pin_3);\
                                        else                \
                                        GPIO_ResetBits(GPIOC,GPIO_Pin_3)


/* 直接操作寄存器的方法控制IO */
#define        digitalHi(p,i)                        {p->BSRR=i;}                        //设置为高电平               
#define digitalLo(p,i)                        {p->BRR=i;}                                //输出低电平
#define digitalToggle(p,i)                {p->ODR ^=i;}                        //输出反转状态


/* 定义控制IO的宏 */
#define LED1_TOGGLE                digitalToggle(GPIOB,GPIO_Pin_0)
#define LED1_OFF                digitalHi(GPIOB,GPIO_Pin_0)
#define LED1_ON                        digitalLo(GPIOB,GPIO_Pin_0)

#define LED2_TOGGLE                digitalToggle(GPIOC,GPIO_Pin_4)
#define LED2_OFF                digitalHi(GPIOC,GPIO_Pin_4)
#define LED2_ON                        digitalLo(GPIOC,GPIO_Pin_4)

#define LED3_TOGGLE                digitalToggle(GPIOC,GPIO_Pin_3)
#define LED3_OFF                digitalHi(GPIOC,GPIO_Pin_3)
#define LED3_ON                        digitalLo(GPIOC,GPIO_Pin_3)

void LED_GPIO_Config(void);

#endif /* __LED_H */
里面倒是有个函数声明“void LED_GPIO_Config(void);” 但是没有加extern, 然后主函数里面调用这个函数就能用,所以,一直很疑惑,希望哪位给解释下。
回复 支持 反对

使用道具 举报

发表于 2016-3-14 15:15:05 | 显示全部楼层
extern是指 符号 在外部文件定义的
而头文件include之后,声明都等同于写进同一个c文件了,不属于外部文件,不需要extern
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-14 15:33:17 | 显示全部楼层
flyleaf 发表于 2016-3-14 15:15
extern是指 符号 在外部文件定义的
而头文件include之后,声明都等同于写进同一个c文件了,不属于外部文件 ...

我是初学,可能问的比较低级。
这种声明的方式,应该只是把 “void LED_GPIO_Config(void);” 包含进main.c文件, 这个函数的具体内容应该还是在bsp_led.c 吧

这种声明方式和使用extern的方式有什么区别吗?
回复 支持 反对

使用道具 举报

发表于 2016-3-14 16:10:23 | 显示全部楼层
lazyduck 发表于 2016-3-14 15:33
我是初学,可能问的比较低级。
这种声明的方式,应该只是把 “void LED_GPIO_Config(void);” 包含进mai ...

没有区别
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-11 17:48 , Processed in 0.032728 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表