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。这些XYZ_API宏通常用于有条件地指定特定于平台的链接,例如一些__attributes__需要在 Windows 和 Unix 上进行不同处理的链接。因此,您可以期望GLSAPI在其中一个头文件(可能在config.h)中定义,如下所示:

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

(伪代码,我不确定所有属性和链接“限定符”,但您可以在代码中查找它们。)

于 2013-04-04T06:21:21.097 回答