我有一个名为 myArchive
的 C++ 程序,它从静态 C 库中调用例程。
我的 myArchive
代码有一个名为 Archive
的类,其中包含一个名为 md
的私有(private)变量,类型为 Metadata *
,在我的 C 库中定义。
这是 myArchive.hpp
header :
#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
中引用的其中一个 header 中的声明:
#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
的一个 header 中定义。
我错过了什么或做错了什么?
最佳答案
唯一有意义的解释是,您以某种方式在包含 myLibraryHelpers.h 之前定义了 METADATAHELPERS_H
,这可能是由于之前在某处包含了某些内容——某种循环包含依赖性。您可以尝试使用 g++ -E
来提取预处理后的文本,并尝试查看是否可以从中解决问题(搜索 freeMetaData 出现在其中的位置以了解您的顺序以)结束,但通常解决这些问题可能很棘手
关于c++ - 从 C++ 析构函数调用自定义免费 C 例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8915433/