2012-02-12 1 views
2

私は、ヘッダファイルで宣言されたテストクラスを別のファイルで定義しています。 Windowsでは異なるクラスをコンパイルする必要があるので、私は#if defined (_WINDOWS_)を使います。 #if defined (_WINDOWS_)を含むcppファイルをコンパイルすると、ファイルは別のファイルで定義されていても、シンボル_WINDOWS_が定義されていないかのようにコンパイルされます。コンパイル時のシンボルは#定義されていましたが、#ifdefはそれを見ません

Error Code : error lnk2019 unresolved external symbol public

ソースコード

// test.h 

class Test 
{ 
public: 
#if defined (_WINDOWS_) 

void printwindow(); 
#endif 

void notwindows(); 
}; 

//test.cpp 

#include "test.h" 

#if defined (_WINDOWS_) 
void Test::printwindow() 
{ 
cout << "i am windows "; 
} 
#endif 


void test::notwindows() 
{ 
cout << " not windows " ; 
} 


//main.cpp 

#include "windows.h" 
#include "test.h" 

void main() 
{ 
test t1 ; 

t1.printwindow() // OK I have declared function so my _WINDOWS_ is available but when i run it i get 
} 

Error Code : error lnk2019 unresolved external symbol public

注:私は直接関数を定義する場合、それは何の問題

// test.h 

    class Test 
    { 
    public: 
    #if defined (_WINDOWS_) 

    void printwindow(){couT << "i am window" } 
    #endif 

    void notwindows(); 
    }; 
なしで動作し、私は、コードをコンパイルすると、私は次のエラーを取得しています

しかし、私はこの方法が嫌いです。私はそれらを別々のファイル(hとcpp)で定義する方が好きです。

+0

申し訳ありませんが、この質問は意味がありません。 –

+0

@CodyGray:彼は質問をするために機械翻訳者を使わなければならなかったようです。私はそれを見て、彼はWindowsでコンパイルするときにあるクラスにある特定の追加機能を望んでいます。 – kkm

+0

これはあなたの実際のコードですか?その場合、 '#include '、 'cout'の代わりに' couT'を使用し、 'using namespace std;'(またはstd :: coutを使って) 't1 。:printwindow() 'を実行すると、行の最後にセミコロンがないと、コンパイル時に問題が発生します。 – tinman

答えて

7

あなたが_WIN32の代わり_WINDOWS_を使用することが良いだろうあなたの条件付きコンパイルテスト。 _WINDOWS_は、windows.hが含まれている場合にのみ定義され、コンパイラは、どのヘッダーが含まれているかにかかわらず、Windowsターゲットのビルドに対して自動的に_WIN32を定義します。あなたの状況で_WINDOWS_は、main.cppをコンパイルするときに定義されますが、コンパイル時にはtest.cppであり、test.cppにはwindows.hが含まれていません。

また、_WINDOWS_マクロ定義は、windows.hヘッダーの実装の詳細であり、使用が保証されていません。たとえば、MinGWバージョンwindows.hでは、_WINDOWS_が定義されていません。

3

あなたはそれが_WINDOWS_シンボルが定義されていないTEST.CPPをコンパイルすると、あなたのTEST.CPPファイルに

をWINDOWS.Hを含める必要があります。したがって、ウィンドウ機能を持たないオブジェクトファイルが作成されます。

次に、main.cppにwindows.hをインクルードしているため、test.hppにシンボルが使用されています インクルードの順序を変更すると、差別的な動作をします。あなたは、インクルードの順序に依存しないウィンドウのバージョンをどのように選択するかを考え直すべきです(例えば、_WIN32_についての他の答えを見てください)。

あなたは、いくつかは、別のコードファイル(main.cppに)で定義し使用して、すでにコンパイルされたオブジェクトファイル(TEST.CPP)内のコードを変更することはできません