2

今まで正常に機能していたというヘッダーファイルがありますcustom_types.h。いくつかの列挙型が宣言されていますが、同じ名前の実装ファイルはありません。

これらは、ファイル内の 2 つの宣言です。

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!

このようなガードにより、ヘッダー ファイルの内容が 1 つの翻訳単位 (TU) に 1 回含まれるようになります。

コンパイラがサポートしている場合 (最新のコンパイラはこれをサポートしています)、次のように使用できます#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

ヘッダーは宣言でいっぱいなので、コンパイラーがそれらを 2 回読み取らないようにする必要があります。解決策は、各ヘッダーが(直接または別のヘッダーを介して)1回だけ含まれていることを確認することです。これはそれほど簡単ではありません。

一般的な解決策は、ガードを追加することです。

#ifndef SOME_CONSTANT_THAT_WONT_GET_MISTAKEN
#define SOME_CONSTANT_THAT_WONT_GET_MISTAKEN

... header contents ...

#endif

このヘッダーが複数回インクルードされる場合、コンパイラは両方のコピーを参照しますが、2 番目のヘッダー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 に答える