我遇到,我似乎無法化解,其中有一個全局變量上聲稱在聲明中唯一的一行被重新聲明的問題。我有以下代碼:用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