1

私のプロジェクトには、2 つの cpp ファイルと 1 つのヘッダー ファイルがあります。1 つの cpp ファイルには 1 つのクラスの実装が含まれており、その宣言はヘッダー ファイルにあります。もう 1 つの cpp ファイルは、int main関数を含むファイルです。

クラスのコンストラクターの 1 つにパラメーターが含まれており、リンカー エラーTCHARで未解決の関数として引用されています。LNK2019

私は Visual Studio 2010 を使用してCharacter setおり、プロジェクトのプロパティでオプションを に設定して、 とマクロのどちらを使用Not Setするかを選択できるようにしています。charwchar_tUNICODE_UNICODE

現在、メインの cpp ファイルの先頭でこれらを定義しており、ヘッダー ファイルはこれら 2 つの後にインクルードされます。ただし、ヘッダー ファイルの先頭でこれらのマクロを定義すると、プロジェクトは完全にコンパイルされます。

とにかくこの問題を解決する方法はありますか? または、またはどちらかを使用するようにクラスをハードコーディングする必要がありますcharwchar_t?

ありがとう。

4

2 に答える 2

3

UNICODEmain.cpp内で/_UNICODE マクロを定義しているが、クラスの実装.cpp内では定義していないため、リンカーエラーが発生します。そのため、main.cppにクラスのヘッダーファイルが含まれている場合は、と見なさTCHARwchar_tますが、実装.cppにヘッダーファイルが含まれている場合は、代わりにと見なさTCHARcharます。wchar_tmain.cppが実際に実装していないコンストラクターを呼び出すため、リンカーエラーの原因となる不一致があります。

UNICODE/マクロの存在を探すことになっていますが_UNICODE、実際には手動で定義するのではありません。「文字セット」オプションをMBCSまたはUnicodeに設定して、IDE/コンパイラがプロジェクト全体のマクロをグローバルに管理できるようにします。「未設定」に設定すると実際に何ができるのかわかりませんが、この状況で実際に必要なものではありません。

于 2012-09-16T15:48:32.697 に答える
1

マクロは、明らかにあなたを混乱させるプリプロセッサ構造です。あなたのコードは、たとえあなたが成功したとしても、他の人も混乱させるでしょう。マクロUNICODE_UNICODETCHAR定義する前に定義する必要TCHARがあります。使用する前にマクロを定義するのは遅すぎます。プロジェクトの設定に任せたほうがいいでしょう。

プロジェクトCharacter SetUnicodeに設定します。これは、Windowsが内部で使用する文字セットです。つまり、API呼び出しマクロTCHARは常にに展開されます。どこでも明示的に使用でき、コードの読者は、何が何であるかを正確に理解できます。wchar_tSomething()SomethingW()charwchar_tTCHAR

Windows API関数SomethingA()は単なるラッパーでSomethingW()あるため、Aバージョンを多く使用するのは非効率的です。API関数を呼び出す必要がある場合SomethingA()は、明示的に呼び出してください。そうすれば、非効率的なことをしなければならなかったことが誰にでもわかります。

于 2012-09-16T11:51:59.207 に答える