2015-10-22 7 views
-1

Я знаю, что есть несколько вопросов относительно этой проблемы, но ни один из них не дает решения под моими ограничениями.ошибка C2027: использование неопределенного типа, с несколькими файлами

Я работаю над проектом, в котором указан заголовочный файл mips_cpu.h с определенным API. Я намерен разработать его реализацию без изменения файла заголовка. Этот 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 Вы правы, говоря, что определения структуры не обязательно должны быть в заголовках. Однако, когда тип используется в файле, он должен быть виден, то есть к этому файлу. [Struct Def] (http://stackoverflow.com/questions/228684/how-to-declare-a-structure-in-a-header-that-is-to-be-used-by-multiple-files-in -с). –

ответ

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

Смежные вопросы