C++ Pre-processor define after class keyword and before class name

依然范特西╮ 提交于 2019-12-23 07:30:49

问题


I recently came across this sort of code in someone's opengl shader class and am not sure of its use.

As I understand it from reading IBM's documentation, the #define ONEWORD will remove any occurence of ONEWORD in the subsequent text.

What is the purpose of having ONEWORD in this code at all if all occurrences are removed? What does having a token like that, after a class keyword but before a class name, really mean?
I've only used #define for include guards in the past so this is entirely new for me.

#define ONEWORD

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

The code I saw this in is here: https://dl.dropbox.com/u/104992465/glsl.h
Just in case I've made its context too abstract.


回答1:


Oh, so after looking at the actual code, it's not ONEWORD, but rather GLSAPI. These XYZ_API macros are often used for conditionally specifying platform-specific linkage, such as some __attributes__ which require different treatment on, for example, Windows and Unixes. So you can expect GLSAPI to be defined in one of the header files (maybe in config.h) like this:

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

(Pseudo-code, I'm not sure about all the attributes and linkage "qualifiers", but you can look them up in the code.)




回答2:


It's to allow you to easily add compiler specific keywords to your class declaration. For instance with Visual Studio, if you wanted to put this class in a DLL, you would change your definition to

#define ONEWORD __declspec( dllexport )

See here for another example



来源:https://stackoverflow.com/questions/15803761/c-pre-processor-define-after-class-keyword-and-before-class-name

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!