What is this macro for at the beginning of a class definition?

前端 未结 3 807
無奈伤痛
無奈伤痛 2021-01-14 05:35

I\'m looking through the source of a library and many classes are defined using the following form

class THING_API ClassName 
{
...

Jumping

相关标签:
3条回答
  • 2021-01-14 06:13

    One possible use would be to allow you to conditionally mark the class as callable from other libraries in a cross-platform library.

    class ClassName
    

    would be callable on Windows using MSVC but you'd need

    class __attribute__ ((visibility("default"))) ClassName
    

    for linux using gcc.

    In this case, THING_API might be defined like

    #ifdef _WIN32
    # define THING_API
    #else
    # define THING_API __attribute__ ((visibility("default")))
    #endif
    
    0 讨论(0)
  • 2021-01-14 06:17

    It looks to me very much like export macro, which is required when building a shared library (.dll) on Windows. When compiling with MSVC, You have to put __declspec(export) in that spot when building a library, and __declspec(import) when building its client. This is achieved like so:

    #if COMPILING_DLL
        #define THING_API __declspec(dllexport)
    #else
        #define THING_API __declspec(dllimport)
    #endif
    

    Then you define COMPILING_DLL for the library project, and leave it undefined for all other projects. And if you're not on Windows or compiling a static library, you need to define it blank like it's done in your question.

    P. S. Other Windows compilers use their own keywords instead of __declspec(dllimport), but the principle remains.

    0 讨论(0)
  • 2021-01-14 06:32

    Empty macros like that are often used so that other parsers can gather information from the headers.

    Apple has the empty IBOutlet macro which the Interface Builder uses to allow you to connect variables to UI items in its GUI, and I think Qt uses the technique for their "moc" precompiler.

    0 讨论(0)
提交回复
热议问题