4

プロジェクトの 1 つで C++ DLL を構築しています。クラスの定義方法を標準化しようとしています。したがって、毎回書く代わりに:

class __declspec(dllexport) ClassName

このプロセスを容易にする#defineマクロを作成しています。

#define CLASS( cName ) class __declspec(dllexport) cName

しかし、私がそれを使用していると、次のエラーが表示されます。

Error: Expected a ';'

#defineマクロを使用してクラス作成全体を定義できることは知っていますが、「クラスヘッダー」のみを定義するために使用できますか?

ありがとう、

何百ものクラスを扱うので、私がそうしようとしていることに注意してください。したがって、これらの種類の「自動化」が最も役立ちます:)

編集:

例:

#define CLASS( nClass ) class __declspec(dllexport) nClass

CLASS( APTest )
{                        // Here is the error of missing ';'
public:
    APTest();
};
4

2 に答える 2

1

@Wakely よりも良い方法があります。次のようにします。

#ifdef MYLIB_DLL

#ifndef MYLIB_IFACE
#ifdef MYLIB_IFACE_EXPORT
#define MYLIB_IFACE _declspec( dllexport )
#else  // !MYLIB_IFACE_EXPORT
#define MYLIB_IFACE _declspec( dllimport )
#endif // !MYLIB_IFACE_EXPORT
#endif // !MYLIB_IFACE

#else  // !MYLIB_DLL

#ifndef MYLIB_IFACE
#define MYLIB_IFACE
#endif // !MYLIB_IFACE

そのようなブロックを、dll 内のすべてのファイルで使用されるヘッダーと、dll のパブリック ヘッダーに配置します。

dll からエクスポートする必要があるすべてのシンボルは、次のようにタグ付けされます。

class MYLIB_IFACE MyClass 
{
};

void MYLIB_IFACE myFunc();

次に、dll のすべての .cpp ファイルで、最初の行は次のようになります。

#define MYLIB_IFACE_EXPORT

これを行うと、dllexport/dllimport を使用しない POSIX システムで問題なくビルドされます。lib の dll バージョンをビルドするには、MYLIB_DLL を定義します。(ビルドシステムから制御できるように、コンパイラのフラグでこれを行うことができます)

ライブラリの静的バージョンをビルドするには、MYLIB_DLL を定義しないでください。

@アップデート:

これを拡張して、次のように GCC の可視性をサポートできます。

#ifdef WIN32
#define KX_SYMBOL_EXPORT _declspec( dllexport )
#define KX_SYMBOL_IMPORT _declspec( dllimport )
#else // GCC
#define KX_SYMBOL_EXPORT __attribute__(( visibility ("default")))
#define KX_SYMBOL_IMPORT 
#endif

#ifdef KX_DLL

#ifndef KX_IFACE
#ifdef KX_IFACE_EXPORT
#define KX_IFACE KX_SYMBOL_EXPORT
#else  // !KX_IFACE_EXPORT
#define KX_IFACE KX_SYMBOL_IMPORT
#endif // !KX_IFACE_EXPORT
#endif // !KX_IFACE

#else  // !KX_DLL

#ifndef KX_IFACE
#define KX_IFACE
#endif // !KX_IFACE

#endif // !KX_DLL

簡単にするために、最初の例で GCC ビットを削除します。しかし、これは実際に行う方法です。@Wakelyはとても正しいです。

于 2013-05-21T15:22:25.630 に答える