2012-01-18 13 views
1

私は、静的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つで定義されています。

私は何が間違っているのか、間違っていますか?

+1

'md'がnullの場合にのみ関数を呼び出すことに注意してください。見出しはどのように見えますか? –

+0

そのタイプミスを修正しました。私はSOの質問フィールドに合うように自分のコードを書き直しています。私はそれを逃しました。キャッチをありがとう。 –

+0

freeMetadata関数をプロトタイプ化するヘッダーの関連部分を投稿できますか?それは少なくとも誤植などは除外されます – frankc

答えて

0

唯一の説明は、myLibraryHelpers.hをインクルードする前に何らかの形でMETADATAHELPERS_Hが定義されているということです。 g++ -Eを使用してポストプリコセースされたテキストを抽出し、その問題から解き放つことができるかどうかを試してみることができます(freeMetaDataがどこに表示されているかを検索してください)。これらの問題を解決する一般的な方法は難しいかもしれません。

+0

これが当てはまる場合は、メタデータ変数を使用する行について不平を言うと思います。実際にMETADATAHELPERS_Hを他のものに変更するだけでテストするのはかなり簡単だと思います – frankc

関連する問題