<分区>
我遇到了一个我似乎无法解决的问题,其中一个全局变量声称在声明它的唯一行上被重新声明。我有以下代码:
test_regs.h:
#define TEST_REGS_BASE_ADDRESS 0xA0080000
typedef struct {
union {
unsigned int data;
struct {
unsigned int RESERVED : 16;
unsigned int CHAR1 : 8;
unsigned int CHAR0 : 8;
};
};
} TEST_REG_STRUCT;
typedef struct {
TEST_REG_STRUCT TEST_REG;
} *TEST_REGS;
任务.h:
#ifndef TASKS_H
#include "test_regs.h"
volatile TEST_REGS TST; // This line throws an error
volatile int ok_global;
void func();
#define TASKS_H
#endif
任务.c:
#include "tasks.h"
void func() {
TST->TEST_REG.CHAR1 = 0x52;
TST->TEST_REG.CHAR0 = 0x51;
ok_global++;
}
主.c:
#include "tasks.h"
main() {
TST = (TEST_REGS) TEST_REGS_BASE_ADDRESS;
ok_global = 0;
func();
}
我尝试使用以下命令编译上述代码(使用为 Leon3 处理器开发的最小版本的 GCC):
sparc-elf-gcc -msoft-float -c -g -O2 -o test.o tasks.c main.c
该编译尝试产生以下错误:
tasks.h:4: 错误:“TST”类型冲突
tasks.h:4: 错误:'TST' 的先前声明在这里
值得注意的是,全局变量ok_global
不会造成任何问题;只有变量,在 test_regs.h
中声明的类型,TST
会产生上述错误。这意味着错误不可能是由于 header tasks.h
以某种方式被多次声明所致。有谁知道为什么我编写的代码显然是非法的?
我会注意到,如果我去掉所有 header (test_regs.h
除外),并在一个统一的 C
文件中进行声明,问题就来了离开。另外,我真的必须将 test_regs.h
header 与 tasks.h
header 分开,test_regs.h
是机器生成的,而 tasks.h
不是,并且会根据使用情况而改变。
好的,因为这显然不适合有主持人意识的人,所以这不是一个重复的问题。为了满足现有帖子中的建议,我可以构建我的代码,如下所示(甚至包含 header ,test_regs.h
):
任务.h:
#ifndef TASKS_H
#define TASKS_H
#define TEST_REGS_BASE_ADDRESS 0xA0080000
typedef struct {
union {
unsigned int data;
struct {
unsigned int RESERVED : 16;
unsigned int CHAR1 : 8;
unsigned int CHAR0 : 8;
};
};
} TEST_REG_STRUCT;
typedef struct {
TEST_REG_STRUCT TEST_REG;
} *TEST_REGS;
extern volatile TEST_REGS TST;
volatile int ok_global;
void func();
#endif
任务.c:
#include "tasks.h"
volatile TEST_REGS TST;
void func() {
TST->TEST_REG.CHAR1 = 0x52;
TST->TEST_REG.CHAR0 = 0x51;
ok_global++;
}
主.c:
#include "tasks.h"
main() {
TST = (TEST_REGS) TEST_REGS_BASE_ADDRESS;
ok_global = 0;
func();
}
编译命令:
sparc-elf-gcc -msoft-float -c -g -O2 -o test.o tasks.c main.c
结果:
tasks.h:20: 错误:“TST”类型冲突
tasks.c:3:错误:“TST”的先前声明在这里
有一些特定于 TST
的东西正在破坏全局共享;这不仅仅是一个一般性的“我如何共享全局变量”问题。