3

我正在尝试在 C++ 应用程序中使用 OpenCA (libPKI) 库。但是,当包含文件 pki_x509_data_st.h 时,会遇到以下代码片段:

typedef struct pki_x509_callbacks_st {

 /* ---------------- Memory Management -------------------- */
 void * (*new)  (void    );
 void   (*free) (void *x );
 void * (*dup)  (void *x );

由于“新”指针声明,这不会编译。

我怎样才能让它工作?

更新
重命名“新”变量后,我遇到了一些新问题(“在结构之后使用 typedef 名称”等)。我想避免更改过多的旧 C 代码(修改库头文件让我感到紧张),所以我决定只创建一个最小的隔离层。

4

4 回答 4

6
#define new its_reserved_dammit
#include <pki_x509_data_st.h>
#undef new

不过,我怀疑链接器会对此感到不安。

但是,使用不准备从 C++ 使用的 C 库,链接器无论如何都会抱怨,因为头文件无论如何都缺少重要的extern "C"包装器......

于 2010-04-19T13:03:33.607 回答
4

试试这个:

#define new mynew
extern "C"
{
#  include "pki_x509_data_st.h"
}
#undef new

您还应该做的是更改文件并将错误与您的补丁一起提交。

于 2010-04-19T13:04:09.767 回答
2

如果您能侥幸成功,请将其重命名为不是 C++ 中的保留字的名称。您可能最终不得不重建整个库并在那里应用您的“修复”。

我正在考虑在您的 C++ 代码和 C 库之间构建一个隔离层,可能是一些 C 代码,它只公开您需要使用的函数并将您与其他函数完全隔离。

哦,顺便说一句 - 这是一个函数指针声明,而不是一个变量声明。只是为了澄清这一点...

于 2010-04-19T12:59:41.703 回答
0

它是 C++ 中的保留字。将其重命名为“myNew”或其他名称。

于 2010-04-19T12:56:02.637 回答