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