私は、静的Cライブラリからルーチンを呼び出すmyArchive
というC++プログラムを持っています。カスタムフリーCルーチンをC++デストラクタから呼び出しますか?
myArchive
のための私のコードは、タイプMetadata *
の、私のCライブラリで定義されてmd
というプライベート変数が含まれていArchive
というクラスがあります。
#ifndef MYARCHIVE_H
#define MYARCHIVE_H
#include "myLibraryHeaders.h"
...
namespace Archive {
class Archive {
public:
Archive();
virtual ~Archive();
Metadata * getMd() { return md; }
Metadata ** getMdRef() { return &md; }
void setMd(Metadata *_md) { md = _md; }
private:
Metadata *md;
};
Archive::Archive() {
md = NULL;
}
Archive::~Archive() {
if (md != NULL)
freeMetadata(&md);
}
}
#endif
単にリンクされたリスト内の項目解放さfreeMetadata()
関数:ここ
void freeMetadata(Metadata **md) {
Metadata *iter;
Metadata *prev = NULL;
if (! *md)
return;
for (iter = *md; iter != NULL; iter = iter->next) {
/* ... */
if (prev != NULL)
free(prev);
prev = iter;
}
if (prev != NULL) {
free(prev);
prev = NULL;
}
}
がmyLibraryHeaders.h
で参照ヘッダーの1つで宣言がある:
はmyArchive.hpp
ヘッダーの
#ifdef __cplusplus
extern "C" {
#endif
#ifndef METADATAHELPERS_H
#define METADATAHELPERS_H
typedef struct metadata {
/* ... */
struct metadata *next;
} Metadata;
/* ... */
void freeMetadata(Metadata **md);
/* ... */
#endif
#ifdef __cplusplus
}
#endif
他の変数が、これはある私の質問に関連するものである:
私はこれをコンパイルしようとすると、私は外のスコープのエラーが表示されます。
...
g++ -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -DUSE_ZLIB -DUSE_BZLIB -O3 -Wformat -Wall -Wswitch-enum -static -c myArchive.cpp -o myArchive.o
myArchive.hpp: In destructor "virtual myArchive::Archive::~Archive()":
myArchive.hpp:87: error: "freeMetadata" was not declared in this scope
make: *** [myArchive] Error 1
しかし、私は、ヘッダーを含めていますファイルfreeMetadata()
を宣言するファイル(myLibraryHeaders.h
)。さらに、コンパイラはMetadata
型についても不平を言っていません。それ自体はmyLibraryHeaders.h
のヘッダの1つで定義されています。
私は何が間違っているのか、間違っていますか?
'md'がnullの場合にのみ関数を呼び出すことに注意してください。見出しはどのように見えますか? –
そのタイプミスを修正しました。私はSOの質問フィールドに合うように自分のコードを書き直しています。私はそれを逃しました。キャッチをありがとう。 –
freeMetadata関数をプロトタイプ化するヘッダーの関連部分を投稿できますか?それは少なくとも誤植などは除外されます – frankc