Противоречивые заявления о перечислении

Обновить

December 2018

Просмотры

1.5k раз

2

У меня есть заголовочный файл с именем , custom_types.hкоторый не работает нормально до сих пор. У меня есть несколько перечислений , объявленных в нем и нет файла реализации с тем же именем.

Эти два заявления в файле:

enum playback_type {
    NOTE_PB,
    SONG_PB
};

enum note_name {
    C_REG = 1,
    C_SHARP = 2,
    D_REG = 3
};

Теперь по какой - то причине я получаю conflicting declaration errors( полный размер здесь ): введите описание изображения здесь

Вы, ребята, есть какие-либо идеи, почему это происходит? Я не понимаю, как одно определение может быть противоречивым.

3 ответы

0

скорее всего, вы в том числе файл более одного раза, то есть тот же #include в ряде других .h или .c / .cpp Самый простой способ решить это, чтобы в начале каждого .h файла #ifndef, что позволяет избежать переопределение, когда файл уже включен через другой путь включения.

5

Используйте защитные ограждения:

//custom_types.h

#ifndef custom_types_h  //this is called guard!
#define custom_types_h   

enum playback_type {
    NOTE_PB,
    SONG_PB
};

enum note_name {
    C_REG = 1,
    C_SHARP = 2,
    D_REG = 3
};

#endif  //dont forget this line!

Такие охранники убедитесь , что содержимое файла заголовка будет один раз включен в одну ЕП (ТУ).

Если поддерживает компилятор (современные компиляторы поддерживают это), вы можете использовать #pragma onceкак:

//custom_types.h

#pragma once  //it ensures that the content of this header will be 
              //included once in one translation unit

enum playback_type {
    NOTE_PB,
    SONG_PB
};

enum note_name {
    C_REG = 1,
    C_SHARP = 2,
    D_REG = 3
};
2

Поскольку заголовки пестрят деклараций, вы должны убедиться, что компилятор не читает их дважды. После того, как решение будет убедиться, что каждый заголовок включается (непосредственно или через другой заголовок) только один раз. Это не так просто.

Общее решение добавить охранников:

#ifndef SOME_CONSTANT_THAT_WONT_GET_MISTAKEN
#define SOME_CONSTANT_THAT_WONT_GET_MISTAKEN

... header contents ...

#endif

Если этот заголовок получает включены несколько раз, компилятор будет видеть обе копии, но отбросит второй, так как это SOME_CONSTANT...уже определено. То есть, это:

#include "your_file.h"
...
#include "your_file.h"

станет:

#ifndef SOME_CONSTANT_THAT_WONT_GET_MISTAKEN         // not defined
#define SOME_CONSTANT_THAT_WONT_GET_MISTAKEN         // define it

... header contents ...                              // read these

#endif

...

#ifndef SOME_CONSTANT_THAT_WONT_GET_MISTAKEN         // already defined
#define SOME_CONSTANT_THAT_WONT_GET_MISTAKEN         // skip

... header contents ...                              // skip

#endif