2013-11-17 2 views
1

Например, мы следующие исходные файлы:Redefenition из ЬурейеЕ перечисления

types.h:

#pragma once 

typedef enum { RED, GREEN, BLUE } myColorSet; 

whatever.h:

#pragma once 

myColorSet getColor(int args[]); 

whatever.cpp

#include "whatever.h" 
#include "types.h" 

myColorSet getColor(int args[]) { 

    //returning the color according to args 
} 

Составление этих бросков:

'myColorset': redefinition; символ не может быть перегружен с помощью typedef. См. Объявление «myColorset».

Это немного запутанным для меня, но кажется, что составитель считает, что

myColorSet getColor(...); 

из whatever.h является декларация о myColorSet. Я хочу использовать myColorSet в качестве возвращаемого типа в функции getColor. Я что-то упускаю?

Кроме того, когда я включаю «types.h» в what.h (вместо what.cpp), он отлично работает. Но насколько я знаю, лучше избегать включения в .h файлов.

Должен ли я просто включить include в what.h или есть другой (правильный?) Способ? Спасибо.

+2

Вы не включаете 'types.h' в' whatever.h', потому что ...?Не делайте файлы заголовков зависящими от сети на основе .cpp-файла, в который они включены. Это ужасная привычка. Потребитель 'what.h' ожидает, что он принесет то, что ему нужно для единицы перевода. Тот, кто сказал вам «лучше не включать в .h файлы», должен быть помещен в список «не слушайте их». – WhozCraig

ответ

0

Когда вы объявляете myColorSet getColor(int args[]), компилятор еще не знает myColorSet; но это необходимо, потому что myColorSet является типом возврата этой функции.

Вы правы, лучше не включать файлы .h. Но это относится только к ситуации, когда вам нужно выбирать между #include и форвардной декларацией. В этом случае предпочтительной является форвардная декларация. Бывают случаи, когда форвардного декларации недостаточно. В этих случаях у вас есть, чтобы использовать #include.

Вы можете уйти без изменения заголовков с помощью whatever.cpp как

#include "types.h" 
// myColorSet is now known, so we can declare getColor(int args[]) now: 
#include "whatever.h" 

myColorSet getColor(int args[]) { 

    //returning the color according to args 
} 

, но это не рекомендуется, потому что теперь компиляция зависит от порядка, в котором включены заголовки.

+0

Очень хорошее объяснение, а также ваш совет о заказе, который, к счастью, объясняет, почему я был почти уверен, что если я включу что-то в what.cpp, компилятор узнает об этом, потребляя что угодно. X x) Спасибо, добрый сэр. –

2

В whatever.h, вам нужно поставить

#include "types.h" 

или без него, компилятор не распознает тип, даже если он был объявлен в whatever.cpp с whatever.h; ошибка встречающийся в whatever.h

Другим решением было бы, чтобы избавиться от types.h, и положить, что typedef в whatever.h и удалить #include "types.h" из whatever.cpp, что означало бы вы должны сделать #include "types.h" в любом случае, и это означало бы, что у вас было бы меньше файлов для включения [легче запомнить]

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