2012-03-19 11 views
2

私は奇妙な状況に遭遇しました。 #ifndef #define #endifフラグをすべての.hファイルに置いた場合、インクルードヘッダファイルの順序はあまり関係ありません。' - 'トークンの前にunqualified-idが必要です

旧コードが a.h

#ifndef A_H 
#define A_H 
    blah blah blah 
#endif 

a.cc

#include "a.h" 
blah blah blah 

とコード上ではうまくいきました。

は今は

#ifndef B_H 
#define B_H 
    blah blah blah 
#endif 

新しいa.cc

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

OKコンパイル上記a.cc b.h b.h

新しいヘッダを追加しました。しかし、私は

新しいa.ccバージョンのエラーで失敗しました。コンパイル2

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

にa.ccを変更する場合:前に期待修飾されていない-ID「 - 」トークン。

ごく小さな例では、同じエラーを再現できません。コンパイルエラーの結果、大きなプロジェクトが発生しました。そして、私が上記のように作成された小さな例でテストした場合。それはコンパイルされましたが、もし私がプロジェクトに戻ってきたら。 #include指令は重要です。私はこの問題がどこで起こるか分かりません。 誰かが私に手がかりを与えることができます多くの役に立つでしょう。 ありがとうございました

[解決済み] 私は自分でこの問題を解決しました。しかし、他の人々もそれにこだわっているかもしれないと思います。問題の原因となった理由は、あなたがこの2行

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

を交換する場合は、エラーがunqualified-期待とそれはコンパイルしながら、それは、コンパイルtest.cc

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

に次

のようでした私が言ったように、 ' - 'トークンの前のid。

+2

'#include'は基本的にはコピーアンドペーストのプロセスなので、インクルードの順序は重要です。最小のテストケースを作成するように努めてください。それ以外の場合、私たちがあなたに与えることのできるヘルプはありません。 –

+0

ヘッダファイルのインクルード順序は関係ありません。 –

+0

ヘッダに '#define'マクロが含まれている場合や、' b.h'の最後に何らかのエラーがある場合は、*は関係ありません。おそらく ';'または '}'が欠けていますか? –

答えて

3

もちろん、インクルード注文の問題です。インクルード・ディレクティブは、基本的に、現在のトランスレーション・ユニットのヘッダーの内容をコピー・ペーストします。 b.hで必要とされるタイプがa.hに定義されている場合は、の前にa.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; 
} 

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

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

、しかし、あなたが含まれての順序を逆場合は、あなたが取得したい:明らかに誤りである

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

しかし、それを行うための最も正しい方法はb.ha.h含めている:

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

そのように、他のヘッダを気にせずにb.h缶を含めるしたい人は誰でも。

関連する問題