我遇到,我似乎无法化解,其中有一个全局变量上声称在声明中唯一的一行被重新声明的问题。我有以下代码:用C共享全局变量typedef定义重新声明
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;
tasks.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
tasks.c:
#include "tasks.h"
void func() {
TST->TEST_REG.CHAR1 = 0x52;
TST->TEST_REG.CHAR0 = 0x51;
ok_global++;
}
的main.c:
#include "tasks.h"
main() {
TST = (TEST_REGS) TEST_REGS_BASE_ADDRESS;
ok_global = 0;
func();
}
我试图编译使用以下命令上面的代码(使用GCC的最小版本为LEON3处理器开发):
sparc-elf-gcc -msoft-float -c -g -O2 -o test.o tasks.c main.c
即编译尝试产生以下错误:
tasks.h:4: error: conflicting types for 'TST'
tasks.h:4: error: previous declaration of 'TST' was here
值得注意的是,全局变量,ok_global
不POS任何问题;只有可变的,具有In test_regs.h
被声明的类型,TST
产生上述错误。这意味着错误不能归因于标题tasks.h
以某种方式被多次声明。有没有人有任何想法,为什么我写的代码显然是非法的?
我会注意到,如果我摆脱所有标题,除了test_regs.h
,并在一个统一的C
文件中声明,问题就消失了。另外,我真的必须有test_regs.h
头球tasks.h
头分离,test_regs.h
是机器产生的,而tasks.h
不是,将根据使用情况而改变。
好了,因为这显然不是为主持人的头脑乡亲下沉,这不是一个重复的问题。我可以构建我的代码,以满足现有岗位的建议如下(甚至在头吸吮,test_regs.h
):
tasks.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
tasks.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: error: conflicting types for 'TST'
tasks.c:3: error: previous declaration of 'TST' was here
有一些具体的事情到TST
是BRE全球共享;这不仅仅是一般的“我该如何分享全局变量”的问题。
将'#define TASKS_H'移动到文件的顶部,紧接在'#ifndef TASKS_H'之后。 – e0k
不要'typedef'指针,这是一个可怕的想法。除非它们是100%不透明类型。 –
e0k,感谢您的建议,但是这并没有解决问题。另外,我不认为'test_regs.h'可以被多次获取,因为你的建议似乎暗示了,因为'ok_global'不会出现同样的重新声明错误。 – user3570982