c++ - 头文件中函数声明前面的预处理器标识符

标签 c++

我正在阅读一个头文件,我注意到程序员在函数声明中的返回值前面放置了一个预处理器标识符,如下所示。

#ifndef SAMPLE_API
#define SAMPLE_API
#endif

...

namespace SampleName
{
    SAMPLE_API bool api_function();
    ...
}

它的用途是什么,它是如何工作的?

编辑:我正在阅读 IMGUI 中的 imgui.h项目。

最佳答案

通过定义 SAMPLE_API(在您的编译器命令行上,在您的 Makefile/IDE 环境中等),您可以向此 header 中的每个函数声明添加一些内容。

如果您没有定义SAMPLE_API,前几行...

#ifndef SAMPLE_API
#define SAMPLE_API
#endif

...确保 SAMPLE_API 被“定义”,即

SAMPLE_API bool api_function();

...被预处理为...

bool api_function();

...所以“什么都没有发生”(而不是当编译器遇到 SAMPLE_API 并且不知道如何处理它时出现“语法错误”)。

构造像这样的 SAMPLE_API 符号的通常原因是在构建/使用 Windows 库时处理符号导出/导入。

您可以将 SAMPLE_API 定义为...

  • __declspec(dllexport) 构建 Windows 库时,
  • __declspec(dllimport)使用 Windows 库时,

...所以相关函数的符号会根据需要导出/导入。

还有其他一些事情可以用这样的预处理器符号来完成(比如弃用函数,这样链接器就会在它们被使用时发出警告),或者其他特定于平台的东西。但我猜您正在查看此处的 dllexport/dllimport 管道。

关于c++ - 头文件中函数声明前面的预处理器标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39533159/

相关文章:

C++ 继承获取错误

c++ - 如何在 C++ 中访问语言环境和全局

c++ - cpp 中使用 stack<string> 的 stack.top() 和 stack.pop() 的返回类型是什么?

c++ - 同一个程序运行时间差异很大,有时达到1000+us

c++ - 点到直线的正交投影

c++ - 用于创建对象的堆或堆栈?

c++ - 套接字 : send() function returned 'Broken Pipe' error

c++ - 获取指向容器末尾的原始指针

c++ - 如何使用 Gradle MSBuild 插件运行 SonarQube Scanner?

c++ - 为什么 `throw MyClass' 不起作用而 `throw MyClass()' 起作用?