我在使用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多次定义的。
我没有更多想法如何更改我的代码以使其工作。谢谢你的任何建议。
答案 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