2016-10-27 11 views
-2

私のC++プロジェクトには、正常であることがわかっている従来のヘッダーファイルがあります。コードベースのさまざまな場所で問題なく動作します。ヘッダーファイルは#includeで正常に動作し、別のファイルに構文エラーが発生します

それは私が問題の一部であるかもしれないと思うことで他のヘッダ、多くのでドラッグを行います。

/* legacy.h: */ 

#include "A.h" 
#include "B.h" 

// (Some definitions I need) 


/* A.h: */ 

#include "C.h" // The rabbit hole continues for another few layers 


/* B.h */ 

#include <windows.h> 
#include "D.h" // Again, this also pulls in more things 

私も数週間のためにうまく働いています。このプロジェクトに新しいモジュールを書きました:

/* module.h */ 

// Status codes for new module 
struct Status { 
    enum Enum   
    { 
     ALL_GOOD = 0, 
     ERROR 
    }; 
}; 


/* module.cpp */ 

#include "module.h" 

// (Code that previously didn't require the legacy header) 

今日、私はレガシーヘッダーを引き込むのに必要な比較的小さな追加を行いました。

突然、何もコンパイルされません!

エラーC2143:構文エラー:私のような紛らわしい構文エラーの数百取得行方不明「}」「定数」

変なふう前に、これらのエラーはmodule.hのいずれかで別の行に開始しますまたはmodule.cppを使用してください。

問題は、私の新しいコードmodule.cppとは関係がないようです。ヘック、私は数週間働いていたバージョンに戻りました。それでも動作しますが、2番目にはlegacy.hが含まれています。

ここでは何が起こっていますか? 私のモジュールとこのヘッダはどちらもうまく動作することがわかっていますので、どうすればの構文をにするとエラーになるのですか?

+1

エラーは何ですか?ところで、問題なく何年も "働いていた"という理由だけで、* "正常であることが知られています" *というコードを仮定することは決してありません。 – zvone

+0

downvotersは説明できますか?私は質問に答えました。なぜなら、このようなものが、問題に遭遇したときに存在していたとしても、私は仕事の一日を節約できたからです。症状は不思議でしたが、根本的な原因はシンプルで私を愚かに感じました。私は意図的に問題を抱えながら探していた条件でそれをソファーにしようとしましたが、より一般的に役立つように改善したいと思います。 – Bear

答えて

3

あなたはlegacy.hのインクルードチェーンのどこかにあるプリプロセッサマクロの犠牲になっているようです。あなたのヘッダーで述べたように、私は構文エラーがステータスの最初の使用に起因:: ERRORを賭けたい:この場合

/* module.h */ 

// Status codes for new module 
struct Status { 
    enum Enum   
    { 
     ALL_GOOD = 0, 
     ERROR // <- Syntax errors appear here 
    }; 
}; 

、犯罪者は

/* B.h */ 

#include <windows.h> 

私が思うおそらくWINDOWS.H ERRORというマクロがあります。

プログラマがマクロを定義すると、そのような名前を選択することが多いため、enum定義にはすべての大文字とは異なる命名規則を使用することを検討してください。

関連する問題