2016-05-18 8 views
0

私はここで何を得ているのかというと、ダムとノービーの質問ですが、ウェブ上で答えを見つけられません。 私は(既存のC++プロジェクトのうち)DLLプロジェクトを作成したい場合は、私は.hファイルの先頭に以下の行を実装する必要があることを読んで:DLLファイル内の複数のクラス

#ifdef _EXPORTING 
#define CLASS_DECLSPEC __declspec(dllexport) 
#else 
#define CLASS_DECLSPEC __declspec(dllimport) 
#endif 

私は例を見てMSDN:

// MathFuncsDll.h 
#ifdef MATHFUNCSDLL_EXPORTS 
#define MATHFUNCSDLL_API __declspec(dllexport) 
#else 
#define MATHFUNCSDLL_API __declspec(dllimport) 
#endif 

は今、私は私が作るすべての新しいクラスのための「_EXPORTING」と「CLASS_DECLSPEC」を変更する必要がありますか、理解したいですか?

// FooDll.h 
#ifdef FOO_EXPORTS 
#define FOO_API __declspec(dllexport) 
#else 
#define FOO_API __declspec(dllimport) 
#endif 

または:「MathFuncsDll.hは」私は.hファイルの先頭に以下の行を配置する必要があるだろうと私は同じプロジェクト内で「foo」という名前のクラスを作成したい場合例えば いくつかの行は、プロジェクトのすべての.hファイルで同じですか?

さらに、namespaceを使用してDLL全体を1つとして参照し、そこからクラスを抽出すると、すべての.hファイルにusing namespace *NAME*を入れる必要がありますか?

+0

マクロが何であるかを学び、何が起こっているのかを知ることができます。 – PcAF

答えて

1

いいえ、あなたは、各クラスのための新しいマクロを作成する必要はありません。第二のqについては

class MATHFUNCSDLL_API Foo {...}; 
class MATHFUNCSDLL_API Boo {...}; 
class MATHFUNCSDLL_API MyNewClass {...}; 

:ヘッダファイル内の名前空間を使用して使用しないでください。"using namespace" in c++ headers

あなたのヘッダできるのように見えます次

#pragma once 
namespace foo { 
    class MATHFUNCSDLL_API Foo {...}; 
    class MATHFUNCSDLL_API Boo {...}; 
    class MATHFUNCSDLL_API MyNewClass {...}; 
} 

EDITED

// mylibdef.h 
#pragma once 
#ifdef _EXPORTING 
#define CLASS_DECLSPEC __declspec(dllexport) 
#else 
#define CLASS_DECLSPEC __declspec(dllimport) 
#endif 

// myclass1.h 
#pragma once 
#include "mylibdef.h" 
namespace mylib { 
class CLASS_DECLSPEC MyClass1 {...}; 
} 

// myclass2.h 
#pragma once 
#include "mylibdef.h" 
namespace mylib { 
class CLASS_DECLSPEC MyClass2 {...}; 
} 
+0

それで、すべてのクラスに1つのヘッダーを使うべきだと教えてください。それは奇妙に思える.. –

+0

@YechiamWeiss:いいえ、私はあなたが別のヘッダーmydlldef.hに入れて、あなたのヘッダーに1つを含めることができる1つのマクロを使用すると言った。また、クラスごとに別々のヘッダーを作成し、私が示すように名前空間とマルコを使用することもできます。 – AnatolyS

関連する問題