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

时间:2013-04-04 06:11:52

标签: c++ class c-preprocessor

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

正如我从阅读IBM's documentation中理解的那样,#define ONEWORD将删除后续文本中出现的任何ONEWORD。

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

#define ONEWORD

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

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

2 个答案:

答案 0 :(得分:5)

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

#define ONEWORD __declspec( dllexport )

有关其他示例,请参阅here

答案 1 :(得分:4)

哦,所以在查看实际代码之后,它不是ONEWORD,而是GLSAPI。这些XYZ_API宏通常用于有条件地指定特定于平台的链接,例如需要对Windows和Unix进行不同处理的某些__attributes__。因此,您可以期望在其中一个头文件中定义GLSAPI(可能在config.h中),如下所示:

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

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