2017-05-14 23 views
0

我有三個文件變量是一個永遠無法結束的類型

  • 的main.c
  • myStruct.h
  • myStruct.c

聲明我看了一些帖子在哪裏定義一個結構和封裝,我想在頭文件中聲明我的結構並在源文件中定義它。

這就是我測試過的。

myStruct.h

// myStruct.h 
#include "stdint.h" 

typedef struct myStruct myStruct_type; 

myStruct.c

// myStruct.c 
#include "myStruct.h" 

struct myStruct { 
    uint32_t itemA; 
    uint32_t itemB; 
    uint32_t *pointerA; 
    uint32_t *pointerB; 
}; 

的main.c

// main.c 
#include "myStruct.h" 

myStruct_type testStruct; // This is where I get the error message 

int main (void) { 
    while (1); 

    return 0; 
} 

當我嘗試編譯(Keil公司uVision)我得到以下錯誤「變量'testStruct'聲明瞭一個未完成的類型myStruct_type testStruct「

我錯過了什麼?

+0

結構定義需要在需要的每個點都可見。將它從c文件移動到h文件。 –

+0

將'struct myStruct'移動到頭文件中。否則它不可見main.c – kaylum

+0

或者把'myStruct_type * new_myStruct_type(void){return malloc(sizeof(myStruct_type)); }'到'myStruct.c'和'main()'中,只需定義'myStruct_type * pmyStruct = new_myStruct_type();'。 – alk

回答

2

你不能像這樣聲明testStruct,myStruct_type是一個不完整的類型。你最多可以聲明一個指針。

因此改變

myStruct_type testStruct; 

myStruct_type *testStruct; 

你可以認爲它像,而編譯器編譯main.c,它不會對會員信息myStruct_type,所以不能計算大小的結構。

+0

是的,謝謝您的解釋。 – RedSmolf

+0

這意味着你不能直接訪問成員,你必須爲此創建函數。當你想暴露一些必須用來在你的庫之外保存狀態的東西時,這是常見的做法,而不暴露內部結構。這主要適用於例如您在內部使用專用標頭的庫,但只在公共標頭中定義一個虛擬類型。這樣您就可以構建穩定的API,因爲您可以在不影響API的情況下安全地添加/刪除版本之間的成員。 如果你不寫一個圖書館,你不應該打擾。 – Cheatah