从C++析构函数调用自定义的C例程? 我有一个C++程序,叫做MyScGivio,它调用一个静态C库中的例程。
我的myArchive代码有一个名为Archive的类,其中包含一个名为md的私有变量,该变量的类型为Metadata*,在我的C库中定义 以下是myArchive.hpp标题: freeMetadata功能只是释放链接列表中的项目:从C++析构函数调用自定义的C例程? 我有一个C++程序,叫做MyScGivio,它调用一个静态C库中的例程。,c++,c,memory,free,destructor,C++,C,Memory,Free,Destructor,我的myArchive代码有一个名为Archive的类,其中包含一个名为md的私有变量,该变量的类型为Metadata*,在我的C库中定义 以下是myArchive.hpp标题: freeMetadata功能只是释放链接列表中的项目: void freeMetadata(Metadata **md) {
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中引用的一个标题中的声明:
我还有一些其他变量,但这是与我的问题相关的内容,即:
当我尝试编译此文件时,会出现范围外错误:
...
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
但我在myLibraryHeaders.h中包含了一个头文件,它声明了freeMetadata。此外,编译器并不抱怨元数据类型,它本身也在myLibraryHeaders.h中的一个头中定义
我遗漏了什么或做错了什么?唯一有意义的解释是,在包含myLibraryHelpers.H之前,您以某种方式定义了METADATAHELPERS,这可能是由于之前的某个包含位置-某种循环包含依赖关系。您可以尝试使用g++-E提取预处理后的文本,并尝试从搜索freeMetaData出现的位置来解决问题,以了解最终的顺序,但一般来说解决这些问题可能很棘手注意,您只在md为null时调用函数。标题是什么样子的?修正了错误。我正在编写代码以适应SO问题字段,但我错过了这一点。谢谢你的关注。你能发布标题中与freeMetadata函数原型相关的部分吗?这至少可以排除打字错误,比如myArchive.hpp漏掉了一个字母;在类定义之后。这不应该编译,但与您描述的错误不同。我想知道freeMetadata是否以某种方式被塞进了其他人的命名空间中?如果你评论调用和编译/链接,如果你不在*nix上,你能做nm-a-C | grep freematada或任何windows等价物,看看它是如何定义的吗?如果是这样,我想它会抱怨任何使用元数据变量的行。我认为,通过简单地将METADATAHELPERS更改为其他内容,实际上很容易进行测试
#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