1

プロジェクトの設定方法についてアドバイスが必要です。静的ライブラリを構築していますが、行き過ぎる前に、プリコンパイル済みヘッダーの使用方法が正しいかどうかを知りたいと思っています。

これまでのところ、私のstdafxファイルには(DWORDなどのタイプの場合)と(std :: stringの場合)が含まれています。

TestFuncs.cpp/hという単純なcpp/ヘッダーコンボを作成しました

TestFuncs.cpp:

#include "stdafx.h"
using namespace std;
void MyFunc(DWORD a, string b) {
    // irrelevant
}

TestFuncs.h

#pragma once
void MyFunc(DWORD a, std::string b);

ここでのこのコードは正しくコンパイルされます。私が抱えている問題は、この静的ライブラリを別のプロジェクトで使用したい場合、通常は#include "path_to_my_static_lib_project/TestFuncs.h"を実行することです。

ただし、これに関する問題はTestFuncs.hに基づいており、DWORDと文字列はstdafx.hファイルから定義されたタイプであるため、その時点では不明です。

私が思いついた解決策の1つ(そうすることが正しいかどうかはわかりません)は、#pragmaの後にTestFuncs.hの先頭にstdafx.hを一度含めることです。これで、プロジェクトはプリコンパイル済みヘッダーを使用するかどうかに関係なくファイルを処理します。

これはどのように行われるべきですか、それともこれを行う適切な方法がありますか?

ありがとうございました。

4

1 に答える 1

5

#include "stdafx.h"ライブラリのパブリック ヘッダー ファイルには含めないでください。公開ヘッダー ファイルとは、ライブラリのクライアントが使用するヘッダー ファイルを意味します#include

代わりに、絶対最小値のみを定義し、できればこのファイルで 100% 移植可能なコードを使用してください。また、ライブラリが異なるコンパイラまたはプラットフォームで使用される場合は、STL の使用を避けてください。

my_library.hで実装されているパブリック ヘッダー ファイルがあるとしgizmo.cppます。次のようになります。

gizmo.cpp

#include "stdafx.h"
#include "my_library.h"

int GizmoTronic()
{ 
  // ...
  return 42;
}

#pragma onceまた、話題から外れていますが、C++ 言語の一部ではないマクロ ガードを使用しているため、すべてのコンパイラでサポートされているわけではありません。ついてしまうのは悪い癖です。

編集:

ヘッダーが -ed のときに定義されないDWORDという問題については、 3 つの提案があります。string#include

1) 移植可能なデータ型のみを使用します。つまり、標準によって定義されたデータ型です。 DWORDマイクロソフトの発明です(数十年前から)。これは言語の一部ではなく、移植性がありません。代わりに、unsigned longまたは他の適切なものを使用してください。

2)stringあなたのライブラリがあなた以外のコンパイラでコンパイルされたコードによって使用される場合、ライブラリのパブリック インターフェイスで使用しないでください。その理由はstring、ヘッダー ファイルで完全に定義されているため、各コンパイラが独自の実装を持っている可能性があるためです。あるコンパイラstringは別のコンパイラとは異なって見えるかもしれません。

3) #2 が当てはまらないと仮定して、ヘッダーの上部に標準ライブラリから#include必要なヘッダーを追加してください。パブリック インターフェイスで使用する場合は、ヘッダーで。(ただしないでください)。ヘッダーは自己完結型である必要があります。string#include <string>using namespace std

EDIT2:

関数を宣言する方法は次のとおりです。

void MyFunc(unsigned long a, const char* b);
于 2010-11-15T03:42:11.437 に答える