C++预处理器在类关键字之后和类名之前定义

Kat*_*shu 9 c++ class c-preprocessor

我最近在某人的opengl着色器类中遇到过这种代码,我不确定它的用途.

据我所知,通过阅读IBM的文档,#define ONEWORD将删除后续文本中出现的任何ONEWORD.

如果删除所有事件,在此代码中使用ONEWORD的目的是什么?在类关键字之后但在类名之前,拥有这样的标记真的意味着什么?
我过去只使用#define作为包含警卫,所以这对我来说是全新的.

#define ONEWORD

class ONEWORD FooClass
{
    FooClass();
    ~FooClass();
};
Run Code Online (Sandbox Code Playgroud)

我在这里看到的代码是:https://dl.dropbox.com/u/104992465/glsl.h
以防万一我的上下文过于抽象.

joh*_*ohn 6

它允许您轻松地将编译器特定关键字添加到类声明中.例如,对于Visual Studio,如果要将此类放在DLL中,则应将定义更改为

#define ONEWORD __declspec( dllexport )
Run Code Online (Sandbox Code Playgroud)

请看这里的另一个例子


小智 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
Run Code Online (Sandbox Code Playgroud)

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