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 に答える