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这里是全尺寸): 在此处输入图像描述

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

4

3 回答 3

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
};
于 2012-07-29T17:22:55.120 回答
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
于 2012-07-29T17:22:59.783 回答
0

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

于 2012-07-29T17:23:14.293 回答