2

私は、一種の API を使用している既存の C++ コードに取り組んでいます。コードを閲覧しているときに、初めて見た奇妙な構文を見つけました。それが何をするのか、どのように呼び出されるのかわかりません。

こんなふうになります:

class KINDA_API foobar : public foo {
    // Some class declarations
};

foob​​ar の後のことはすべて理解できます。しかし、その KINDA_API は何を意味するのでしょうか? これは何をしますか?それは何らかの高度な派生物ですか、それともそのようなものですか?これに答えるスレッドが他にあるのかもしれません。私もそれを検索しましたが、これがどのように呼ばれているかさえわかりません^^'

4

3 に答える 3

6

通常、OMGWFT_API 宣言がこの正確な方法で表示される場合、これは正しい「モード」でライブラリを構築するための「魔法のスイッチ」です。

  • 静的リンク - OMGWFT_API を "" (空の文字列) に置き換え
  • 動的リンク - DLL - declspec(dllexport) に置き換えられた OMGWFT_API
  • 動的リンク - EXE - declspec(dllimport) に置き換えられた OMGWFT_API

すなわち

#ifdef BUILD_ME_AS_STATICLIB
#define OMGWFT_API
#else
#ifdef BUILD_ME_AS_DLL
#define OMGWFT_API declspec(dllexport)
#else
#define OMGWFT_API declspec(dllimport)
#endif
#endif

もちろん、これは単なる例のスケッチですが、要点は理解できたと思います。たまたま覚えているので、キーワードは GCC< ではなく MSVC から取得されます。

「BUILD_ME_AS....」マクロは、プロジェクト オプションまたは -D コマンド ライン スイッチを介して定義されます。

ただし、OMGWFT_API は任意の意味を持つように設定できるため、これを設定する #define を grep/search してください。

于 2013-07-04T08:39:53.817 に答える
3

#defineコンパイル前に何らかの「魔法」を行うのは -d マクロだと思います。

于 2013-07-04T08:33:15.433 に答える
1

既存の呼び出しに目を通すと、次のようなものが見つかる可能性があります。

#ifdef _WIN32
#define KINDA_API <windows specific attribute>
#elif __linux
#define KINDA_API <linux specific attribute>

等...

これらのマクロは、オペレーティング システムではなく、コンパイラやそのバージョンによって条件付けられる可能性が高くなりますが、お分かりになると思います...

于 2013-07-04T08:38:55.973 に答える