11

私は最近、誰かの opengl シェーダー クラスでこの種のコードに出くわしましたが、その使用方法がわかりません。

IBM のドキュメントを読んで理解しているように、 #define ONEWORD は、後続のテキストでの ONEWORD の出現をすべて削除します。

すべてのオカレンスが削除された場合、このコードに ONEWORD を含める目的は何ですか? クラス キーワードの後、クラス名の前に、そのようなトークンを使用することの本当の意味は何ですか?
過去に #define をインクルード ガードにしか使用したことがないので、これはまったく新しいことです。

#define ONEWORD

class ONEWORD FooClass
{
    FooClass();
    ~FooClass();
};

これを確認したコードは次のとおりです: https://dl.dropbox.com/u/104992465/glsl.h
念のため、コンテキストを抽象化しすぎました。

4

2 に答える 2

7

クラス宣言にコンパイラ固有のキーワードを簡単に追加できるようにするためです。たとえば、Visual Studio で、このクラスを DLL に入れたい場合は、定義を次のように変更します。

#define ONEWORD __declspec( dllexport )

別の例については、こちらを参照してください

于 2013-04-04T06:18:23.893 に答える
5

ああ、実際のコードを見てみるとONEWORD、 ではなくGLSAPI. これらのマクロは、Windows と Unix などで異なる処理を必要とするものXYZ_APIなど、プラットフォーム固有のリンケージを条件付きで指定するためによく使用されます。したがって、ヘッダー ファイルの 1 つ (おそらく) で次のように定義される__attributes__ことが期待できます。GLSAPIconfig.h

#ifdef WIN32
#    define GLSAPI __dllimport
#elif defined __linux__
#    define GLSAPI __attribute__((visibility("visible")))
#else
#    define GLSAPI
#endif

(疑似コード、すべての属性とリンケージの「修飾子」についてはわかりませんが、コードで調べることができます。)

于 2013-04-04T06:21:21.097 に答える