2

我正在处理现有的 C++ 代码,它使用一种 API。在浏览代码时,我发现了一个奇怪的语法,这是我现在第一次看到的,我不知道它是做什么的,也不知道它是如何被调用的。

它是这样的:

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

foob​​ar 之后的一切对我来说都是可以理解的。但是,KINDA_API 是什么意思?这是做什么的?那是某种高级推导或类似的东西吗?可能还有其他的 Thread 可以回答这个问题,我也搜了下,但是我什至不知道这个怎么叫^^'

4

3 回答 3

6

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

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

IE

#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/搜索 #define 来设置它。

于 2013-07-04T08:39:53.817 回答
3

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

于 2013-07-04T08:33:15.433 回答
1

如果您查看现有的呼叫,您可能会发现以下内容:

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

ETC...

这些宏更有可能以编译器和/或其版本而不是操作系统为条件,但你明白了......

于 2013-07-04T08:38:55.973 回答