这个宏在类定义的开头是什么?

时间:2013-12-05 12:19:54

标签: c++ class macros c-preprocessor

我正在查看库的源代码,并使用以下格式定义了许多类

class THING_API ClassName 
{
...

跳转到宏定义。 。

#ifndef THING_API
 #define THING_API   /**< This macro is added to all public class declarations. */
#endif

这可能是什么,这是一种常见的技术吗?

3 个答案:

答案 0 :(得分:5)

它在我看来非常像导出宏,这在Windows上构建共享库(.dll)时是必需的。在使用MSVC进行编译时,您必须在构建库时将__declspec(export)置于该位置,并在构建其客户端时__declspec(import)。这是这样实现的:

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

然后为库项目定义COMPILING_DLL,并为所有其他项目保留未定义。如果您不在Windows上或编译静态库,则需要将其定义为空白,就像在您的问题中一样。

P上。 S.其他Windows编译器使用自己的关键字而不是__declspec(dllimport),但原则仍然存在。

答案 1 :(得分:3)

一种可能的用途是允许您有条件地将该类标记为可从跨平台库中的其他库调用。

class ClassName

可以在Windows上使用MSVC调用,但您需要

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

for linux using gcc。

在这种情况下,THING_API可能被定义为

#ifdef _WIN32
# define THING_API
#else
# define THING_API __attribute__ ((visibility("default")))
#endif

答案 2 :(得分:1)

经常使用类似的空宏,以便其他解析器可以从标题中收集信息。

Apple有一个空的IBOutlet宏,Interface Builder使用它来允许您将变量连接到其GUI中的UI项目,我认为Qt将这种技术用于他们的“moc”预编译器。