gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:09:28 24 4
gpt4 key购买 nike

我在使用 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

蓝牙.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 */
}

蓝牙.c

#include "bluetooth.h"

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

引脚.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 中对外部引脚 BT_ENABLEe 和 P2_0 的引用时,编译器表示,从 bluetooth.c 引用的这些对象未定义。但是当我离开它们时,编译器说它们是由 bluetooth.o 和 main.o 多重定义的。

我不知道如何更改我的代码以使其正常工作。感谢您的任何建议。

最佳答案

删除行

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

const pin BT_ENABLE;
const pin P2_0;

来自main.h和bluetooth.h并将它们放在pins.c中,就在InitPins()定义之前。并初始化全局内联:

#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 文件中 pin 声明中的 const 关键字。

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

关于c - 使用 extern 关键字在多个源文件上定义全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33274849/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com