使用extern关键字在多个源文件上定义全局变量

时间:2015-10-22 06:43:42

标签: c global-variables extern

我在使用extern关键字将自定义结构对象定义为全局时遇到问题,因此我可能会在更多源文件中使用它。我尝试了很多变种,但到目前为止,我无法构建我的项目而没有错误。这就是我到目前为止所做的:

main.h

#ifndef _MAIN_H_
#define _MAIN_H_

#include "pins.h"
#include "bluetooth.h"

const pin P0_21;
const pin P0_22;
const pin P0_27;

#endif

bluetooth.h

#ifndef _BLUETOOTH_H_
#define _BLUETOOTH_H_

#include "pins.h"

void EnableBT(void);

const pin BT_ENABLE;
const pin P2_0;

#endif

pins.h

#ifndef _PINS_H_
#define _PINS_H_

typedef struct
{
    int port;
    int pin;
    int jump_phase;
    int jump_counter;
} pin;

extern const pin P0_21;
extern const pin P0_22;
extern const pin P0_27;
extern const pin BT_ENABLE;
extern const pin P2_0;
extern const pin P2_2;
extern const pin P2_3;
extern const pin P2_7;

void InitPins(void);

#endif

的main.c

#include "main.h"

int main()
{
    InitPins();

    /* Using pins from main.h */
}

bluetooth.c

#include "bluetooth.h"

void EnableBT()
{
    /* Use pins in bluetooth.h */
}

pins.c

#include "pins.h"

void InitPins()
{
    pin P0_21 = {0,21,0,0};
    pin P0_22 = {0,22,0,0};
    pin P0_27 = {0,27,0,0};
    pin BT_ENABLE = {0,10,0,0};
    pin P2_0 = {2,0,0,0};
    pin P2_2 = {2,2,0,0};
    pin P2_3 = {2,3,0,0};
    pin P2_7 = {2,7,0,0};
}

当我删除bluetooth.h中对extern引脚BT_ENABLe和P2_0的引用时,编译器说,没有定义从bluetooth.c引用的这些对象。但是当我离开它们时,编译器说它们是由bluetooth.o和main.o多次定义的。

我没有更多想法如何更改我的代码以使其工作。谢谢你的任何建议。

1 个答案:

答案 0 :(得分:0)

删除行

const pin P0_21;
const pin P0_22;
const pin P0_27;

const pin BT_ENABLE;
const pin P2_0;
从main.h和bluetooth.h

并在InitPins()的定义之前将它们放在pins.c中。 AND初始化整数内联:

#include "pins.h"

const pin P0_21 = {0,21,0,0};
const pin P0_22 = {0,22,0,0};


void InitPins()
{
...

在InitPins()中删除这些初始化。

或者,您可以在InitPins()中保持初始化,但在pins.c文件中的引脚声明中删除const关键字。

在使用这些引脚的其他文件中,包括pins.h