奇怪的 C++ header 文件函数声明

Strange C++ header file function declaration

我正在阅读一些我试图编译成 python 绑定的源代码,当我尝试 swig -c++ -python my_interface.i 时,我收到了一个奇怪的错误。

我知道源代码是用C++11写的。

// module.hpp
#pragma once

namespace module
{
    MODULE_API void getVersion (unsigned &params);
}
// my_interface.i
%module my_api
%{
#include "module.hpp"
%}

%include "module.hpp"

我无权访问源文件,只有 headers 和我们可以调用的共享库 modulelib.so

有人知道函数 return 类型前的 MODULE_API 是什么意思吗?

当我现在尝试编译时出现错误 module.hpp:29: Error: Syntax error in input(1) 当我删除 MODULE_API 时,输出移动到下一个函数声明,因为它们都有这种声明风格,所以我会删除它们,但我觉得这会破坏某些东西。

现在当我 运行 swig -v -wall -c++ -python my_interface.i 我收到一个错误:

Language subdirectory: python
Search paths:
   ./
   ./swig_lib/python/
   /usr/share/swig3.0/python/
   ./swig_lib/
   /usr/share/swig3.0/
Preprocessing...
Starting language-specific parse...
module.hpp:6: Error: Syntax error in input(1).

这是处理符号可见性的常用模式。例如,Windows 要求您在 编译 库时使用 __declspec(dllexport) 定义函数(因此链接器知道使相应的符号在外部可见),并且 __declspec(dllimport)using/linking 一个库(所以链接器知道这些符号将从 DLL 导入)。

为了避免必须有两个不同的 headers(一个用于编译,一个用于使用库),使用条件定义:

#ifdef WIN32

  #ifdef MODULE_EXPORTS
    #define MODULE_API __declspec(dllexport)
  #else
    #define MODULE_API __declspec(dllimport)
  #endif

#else
  #define MODULE_API
#endif

这只是一个例子。它根本 没有 成为 MODULE_API。一些项目使用 GCC 的 __attribute__((visibility("default")))__attribute__((visibility("hidden"))),但 Windows 是该方案的起源,因为 Windows' default隐藏个符号。