2

私は奇妙な状況に遭遇しました。私の理解では、すべての.hファイルに#ifndef #define #endifフラグを設定した場合、インクルードヘッダーファイルの順序はそれほど重要ではありません。

古いコードああ

#ifndef A_H
#define A_H
   blah blah blah
#endif

a.cc

#include "a.h"
blah blah blah

そして、上記のコードは正常に機能しました。

今、私は新しいヘッダーbhを追加しました

bh

#ifndef B_H
#define B_H
   blah blah blah 
#endif

新しいa.cc

#include "a.h"
#include "b.h"
blah blah blah

上記のa.ccは正常にコンパイルされました。ただし、a.ccをに変更すると

新しいa.ccバージョン2

#include "b.h"
#include "a.h"
blah blah blah

コンパイルはエラーで失敗しました:'-'トークンの前にunqualified-idが必要です。

申し訳ありませんが、小さな例では同じエラーを再現できません。コンパイルエラーにより、大きなプロジェクトが発生しました。そして、上記のように作成された小さな例でテストした場合。コンパイルされましたが、プロジェクトに戻ると。#includeディレクティブの順序は重要です。この問題がどこで発生するかわかりません。誰でも私に手がかりを与えることができれば非常に役に立ちます。前もって感謝します

【解決済み】自分で問題を解決しました。それでも、他の人もそれにこだわっているかもしれないと思います。問題の原因は次のようなものでした。

test.ccで

const int var_undef = -1;
#define var_undef (-1)

これらの2行を入れ替えるとコンパイルされます

#define var_undef (-1)
const int var_undef = -1

私が述べたように、'-'トークンの前にunqualified-idが予想されるエラーでコンパイルされます。

4

1 に答える 1

3

もちろん、インクルードの順序は重要です。include ディレクティブは基本的に、現在の翻訳単位のヘッダーの内容をコピーして貼り付けます。が必要とする型がb.hで定義されている場合は、 の前に含めるか、さらにはa.h含める必要があります。a.hb.ha.h b.h

推定:

//a.h
struct A
{
};

//b.h
struct B : public A
{
};

//main.cc
#include "a.h"
#include "b.h"
int main()
{
   return 0;
}

Aこれは、前に定義されているように正常にコンパイルされBます。翻訳単位は基本的に次のようになります。

struct A
{
};
struct B : public A
{
};
int main() 
{
   return 0;
}

ただし、インクルードの順序を逆にすると、次のようになります。

struct B : public A
{
};
struct A
{
};
int main() 
{
   return 0;
}

これは明らかにエラーです。

ただし、それを行う最も正しい方法は、次のように含めることa.hですb.h

//b.h
#include "a.h"
struct B : public A
{
};

そうすれば、誰でもb.h他のヘッダーを気にせずに含めることができます。

于 2012-03-19T11:49:39.990 に答える