2009-07-14 10 views
0

プリプロセッサスイッチに応じて、2つの実装が可能なクラスがあります。私がこれを処理した方法は、 "src \ CompSwitch1 \ class.h"と "src \ CompSwitch2 \ class.h"を作成することです。私の標準インクルードファイルでは、私は使用しますプリプロセッサスイッチでクラスのバージョンを確認する

#ifdef CompSwitch1 
     #include "CompSwitch1\class.h" 
    #elif CompSwitch2 
     #include "CompSwitch2\class.h" 
    #else 
     #error "Specify CompSwitch1 or CompSwitch2" 
    #endif 

これは、2つのバージョンが必要な私のクラスのほとんどで動作します。しかし、そのうちの1つでは、リンカエラー(lnk2019:未解決の外部シンボル)が発生します。私はMS Visual Studio 2005と2008を使用しています。両方とも表示されています。

.hファイルの先頭に、私はプリプロセッサオプションに対してテストします。 また、簡潔さのために.hファイルのみを参照していましたが、適切なディレクトリにこれらの.cppファイルもあります。

+0

#includeが取り込んでいるクラスの実装(適切な* .cpp)がコンパイルされていないため、おそらくLNK2019が発生しています。エラーの詳細(どのシンボル、どのファイルが定義されているかなど)を教えてください。 –

答えて

0

本当に#ELIF DEFINED(CompSwitch2)になっているはずです。それ以外の場合は、 "CompSwitch2"が1の値で定義されていると仮定しています。

+1

必ずしもそうではありません。定義されていないマクロはブール値コンテキストでは0と評価されます。 –

+2

と定義されていますが、値は1と見なされません。個人的に私はいつも定義されたことをする...私はそれをしないことで過去に奇妙な問題を抱えていた/ – Goz

1

クラスのヘッダーファイルが含まれている可能性がありますが、あなたは間違っている、ヘッダ/ cppのペアをコンパイルする場合は、少なくともコンパイルエラーを取得してはならない

//in compswitch1.cpp 
#ifndef CompSwitch1 
# error "inconsistent header included" 
#endif 

//in compswitch2.cpp 
#ifndef CompSwitch2 
# error "inconsistent header included" 
#endif 

:どちら

0

彼らはあなたのヘッダーが含まれた後、CPPの実装ファイルで、次のプリプロセッサの行(複数可)を置くようにしてくださいリンクエラー。 )多くの場合、cppファイルはコンパイルには含まれていない可能性があります。それらはすべてでコンパイルさかどうかを確認するためのcppファイル内のメッセージプラグマを置く:

#pragma message("Compiling " __FILE__) 

またはCPP-コンパイルユニットに関連する作成されたファイルは、そこにオブジェクトの場合は、ビルドディレクトリに確認してみてください。助け

希望、
Ovanes

0

あなたは前処理のcppファイル(すべてが含まれており、マクロが展開される段階)を使用することができます。

ソリューションエクスプローラ - >プロパティ - > C++ - >プリプロセッサでファイルを右クリックし、 "前処理ファイルを生成"を "行番号付き(/ P)"に設定します。 これをもう一度右クリックし、「コンパイル」を選択します。拡張子「i」を持つファイル)(例:main.i)は、cppが存在するのと同じディレクトリに作成されます。それを開き、インクルードファイルが含まれているかどうかを確認します。

この方法は、ハードコンパイルの問題を解決するためにとても簡単です(たとえば、システムヘッダファイルの一部のマクロがコード内のものを置き換えます)。

関連する問題