枚举的声明冲突

时间:2012-07-29 17:16:59

标签: c++ enums header

我有一个名为custom_types.h的头文件,到目前为止工作正常。我在其中声明了一些枚举,并且没有相同名称的实现文件。

这是文件中的两个声明:

enum playback_type {
    NOTE_PB,
    SONG_PB
};

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

现在由于某些原因我得到conflicting declaration errorsfull size here): enter image description here

你们知道为什么会这样吗?我不明白单个定义如何冲突。

3 个答案:

答案 0 :(得分: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!

这样的警卫确保头文件的内容将被包含在一个翻译单元(TU)中。

如果您的编译器支持(现代编译器支持此功能),您可以使用#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
};

答案 1 :(得分: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

答案 2 :(得分:0)

很可能你不止一次地包含该文件,在其他几个.h或.c / .cpp中也是相同的#include 解决这个问题的最简单方法是在每个.h文件的开头都有#ifndef,当文件已经通过另一个包含路径包含时,它会避免重新定义。