C ++ - 类声明中的两个名称(宏)

时间:2013-07-04 08:31:10

标签: c++ class macros

我正在使用现有的C ++代码,它使用的是一种API。 在浏览代码的过程中,我发现了一种奇怪的语法,这是我第一次看到的,我无法弄清楚它的功能或调用方式。

它是这样的:

class KINDA_API foobar : public foo {
    // Some class declarations
};

foobar之后的一切对我来说都是可以理解的。但是什么意味着KINDA_API?这是做什么的?这是任何类型的高级推导或类似的东西吗? 也许有任何其他线程可以解决这个问题,我也搜索过它,但我甚至不知道这是怎么称呼的^^'

3 个答案:

答案 0 :(得分:5)

通常当您以这种方式看到OMGWFT_API声明时,这是用于以正确的“模式”构建库的“神奇开关”:

  • 静态链接 - 将OMGWFT_API替换为“”(空字符串)
  • 动态链接 - DLL - OMGWFT_API替换为declspec(dllexport)
  • 动态链接 - EXE - OMGWFT_API替换为declspec(dllimport)

#ifdef BUILD_ME_AS_STATICLIB
#define OMGWFT_API
#else
#ifdef BUILD_ME_AS_DLL
#define OMGWFT_API declspec(dllexport)
#else
#define OMGWFT_API declspec(dllimport)
#endif
#endif

这当然只是一个示例草图,但我认为你现在明白了。关键词取自MSVC而不是GCC<因为我意外地记得他们。

然后通过项目选项或-D命令行开关定义“BUILD_ME_AS ....”宏。

但是,OMGWFT_API可以设置为有任何意义,所以一定要grep / search一个设置它的#define。

答案 1 :(得分:3)

我猜这是一个#define - d宏,在编译之前会做一些“魔术”。

答案 2 :(得分:1)

如果您查看现有的通话,您可能会发现类似的内容:

#ifdef _WIN32
#define KINDA_API <windows specific attribute>
#elif __linux
#define KINDA_API <linux specific attribute>

等...

这些宏更可能取决于编译器和/或它们的版本而不是操作系统,但你明白了......