2015-10-22 39 views
-1

我知道有關於此問題的多個問題,但是沒有一個在我的約束下提供解決方案。錯誤C2027:使用未定義類型,有多個文件

我正在開發一個項目,其中給出了具有特定API的頭文件mips_cpu.h。我打算開發它的實現而不改變頭文件。此API包括在一個文件中mips_cpu.cpp作爲聲明的結構:

struct mips_cpu_impl; typedef struct mips_cpu_impl *mips_cpu_h;

我已經然後mips_cpu.cpp定義該結構爲:

struct mips_cpu_impl{ 
//Program Counter 
uint32_t pc; 
uint32_t pcN; 

//General Purpose Registers 
uint32_t GPReg[32]; 

//Special registers for MUL/DIV instructions 
uint32_t LO; 
uint32_t HI; 
----- more code --- 

};

在其他文件mips_cpu_instruction.cpp中使用此結構時出現問題。當我有這樣的代碼:

mips_error ADDI(mips_cpu_h state, uint8_t rs, uint8_t rt, uint16_t imm){ 
uint64_t check = state->GPReg[rs] + imm; 
uint32_t tmp = state->GPReg[rs] + imm; 
      ... 
    more code and appropriate return 
} 

state然後給出了錯誤:使用未定義的類型「mips_cpu_imps」

包括在頭文件結構的聲明解決了這個問題,但我不應該改變頭文件。另外頭文件包含警衛,我不完全理解,但可能是相關的?

+0

你編碼的文件'mips_cpu_instruction.cpp'?如果是這樣,爲什麼你會使用'mips_cpu_impl'?你可能不需要。這是一個* pimpl *肯定 –

+0

結構定義不一定要在標題中。 – molbdnilo

+0

@molbdnilo你說得對,結構定義不一定要在標題中。但是,當文件中使用類型時,它必須是可見的,即該文件。 [結構定義](http://stackoverflow.com/questions/228684/how-to-declare-a-structure-in-a-header-that-is-to-be-used-by-multiple-files-in -C)。 –

回答

1

的問題是,該文件mips_cpu_instruction.cpp不知道struct mips_cpu_imps什麼,因爲它可能包括.h文件,你不能碰(mips_cpu.h),但肯定不是.cpp文件,其中該結構被定義(mips_cpu.cpp) 。您可以將聲明添加到mips_cpu_instruction.cpp,但如果項目中有其他文件使用此結構,則會遇到問題,因爲您必須在其中定義它,並且在鏈接時會得到多個聲明相同的結構。

最好的解決方案是將其添加到無法修改的文件中,但由於無法對其進行修改,因此需要一種解決方法。我會創建另一個.h文件,使用include guards來保護代碼不受多個包含,然後我會安全地#include這個新的.h文件位於每個需要它的.cpp文件的頂部。然後它將被定義爲無處不在,只有一次。最終,這意味着要使用這些API,您必須包含2個.h文件:您不能觸摸的文件和新的文件。如果你不想每次都包含2個文件,你甚至可以在你的新文件中決定#include mips_cpu.h,然後你只需要#include這個新文件,你幾乎可以忘記你的不可修改文件。

+0

謝謝!與@RussSchultz的評論一樣的答案,但更好的解釋 – gorilon

0

您的結構沒有完全定義。它的定義足以讓人們使用這些功能,但不足以實現這些功能。我懷疑這是作業,你的任務是實現這些功能,包括這個結構。

爲了使您能夠得到過去的編程問題,而幫助你直接自己做功課,把:

struct mips_cpu_impl 
{ 
    unsigned GPReg[1]; 
}; 

你mips_cpu_instruction.cpp文件的頂部,你會看到這些編譯器錯誤走開。您需要適當調整陣列的大小並添加模擬MIPS內核所需的任何其他狀態。

p.s.助教是存在的一個原因。

+0

我到目前爲止,我已經明顯已經這樣做了,我更新了問題以明確, – gorilon

+0

您可以將您的確切結構定義複製/粘貼到其他文件中,或者(最好)將結構定義移動到「 my_mips_internal.h「,並將其包含在兩個實現文件中以確保它們始終處於鎖定/步驟。 –

+0

此作品謝謝 – gorilon