我有一个名为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
(full size here):
你们知道为什么会这样吗?我不明白单个定义如何冲突。
答案 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,当文件已经通过另一个包含路径包含时,它会避免重新定义。