我正在阅读一个头文件,我注意到程序员在其声明中的函数返回值前面放了一个预处理程序标识符,如下所示。
#ifndef SAMPLE_API
#define SAMPLE_API
#endif
...
namespace SampleName
{
SAMPLE_API bool api_function();
...
}
它的目的是什么以及它是如何运作的?
修改:我正在IMGUI项目中阅读imgui.h
。
答案 0 :(得分:2)
通过定义SAMPLE_API
(在您的编译器命令行,Makefile / IDE环境等),您可以在此标题中的每个函数声明中添加一些内容。
如果您不定义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管道。
答案 1 :(得分:1)
在这个特定的情况下,它什么都不做。 (请记住,预处理器只是简单的复制和粘贴)。
但是,它可能在某些情况下有用来声明例如declspec
用于导出DLL函数(在这种情况下它将是{ {1}} d不那么简单。不用说,这种事情不是正式的C ++标准的一部分,而是可能利用编译器扩展。