-1

我正在尝试将 PDFium 与 Cython 接口并遇到这些定义/签名:

#if defined(COMPONENT_BUILD)

#if defined(WIN32)
#if defined(FPDF_IMPLEMENTATION)
#define FPDF_EXPORT __declspec(dllexport)
#else
#define FPDF_EXPORT __declspec(dllimport)
#endif  // defined(FPDF_IMPLEMENTATION)
#else
#if defined(FPDF_IMPLEMENTATION)
#define FPDF_EXPORT __attribute__((visibility("default")))
#else
#define FPDF_EXPORT
#endif  // defined(FPDF_IMPLEMENTATION)
#endif  // defined(WIN32)
#else
#define FPDF_EXPORT
#endif  // defined(COMPONENT_BUILD)

#if defined(WIN32) && defined(FPDFSDK_EXPORTS)
#define FPDF_CALLCONV __stdcall
#else
#define FPDF_CALLCONV
#endif


FPDF_EXPORT void FPDF_CALLCONV
FPDF_InitLibraryWithConfig(const FPDF_LIBRARY_CONFIG* config);

我只是习惯了简单的函数声明

return_type function_name();

如何在 Cython 中包装包含调用约定的签名?

4

2 回答 2

2

不幸的是,我在这里找不到您引用的特定宏或函数:https ://github.com/PDFium/PDFium

您可能应该添加您正在使用的库的特定版本。

但是,C 函数声明中除了返回类型、函数名和参数之外,还有一些来自 C 自身之外的东西。

一个不属于 C 标准的特定的一个是调用约定,它指定了发送参数和从函数返回的工作方式。

由于指定此约定的关键字是特定于编译器的,因此将它们放在条件宏中是有意义的,以使代码可移植。

也可以支持不同硬件的交叉编译。

所以FPDF_CALLCONV很可能是这样的:

#ifdef SOME_CONDITION_TO_USE_STD_CALL
    #define FPDF_CALLCONV __stdcall
#endif

C(和 C++)程序中的另一个非标准选项是在 Windows 上构建 DLL 时导出函数的指令。

由于这是特定于平台的,要使 C 代码跨平台,它还需要在条件宏中。

所以,FPDF_EXPORT很可能是这样的:

#ifdef WINDOWS
    #define FPDF_EXPORT __declspec(dllexport)
#else
    #define FPDF_EXPORT
#endif

请注意,在其他平台上,这种“标记”不存在,因此宏可以扩展为空,函数声明以更熟悉的形式保留。

它也应该在您包含使用库的 h 文件版本中留空,而不是用于编译库的版本,因为您不需要此前缀来调用函数。

总而言之,假设您使用的库与您的平台兼容,您可能可以在 Cuthon 界面中省略这两个宏。

于 2020-12-17T11:29:36.390 回答
1

FPDF_EXPORT 和 FPDF_CALLCONV 是宏,它们在文件中定义: https ://pdfium.googlesource.com/pdfium/+/master/public/fpdfview.h

这里需要它们,因为该库可用于不同的系统,并且不同的系统具有不同的创建库接口的约定。

这些调用是您熟悉的格式的扩展:

return_type function_name(args) 

例如,您可以看到 FPDF_CALLCONV 消失,除非您正在为 Windows 构建库。

于 2020-12-17T11:23:16.760 回答