Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C++析构函数调用自定义的C例程? 我有一个C++程序,叫做MyScGivio,它调用一个静态C库中的例程。_C++_C_Memory_Free_Destructor - Fatal编程技术网

从C++析构函数调用自定义的C例程? 我有一个C++程序,叫做MyScGivio,它调用一个静态C库中的例程。

从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) {

我的myArchive代码有一个名为Archive的类,其中包含一个名为md的私有变量,该变量的类型为Metadata*,在我的C库中定义

以下是myArchive.hpp标题:

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中引用的一个标题中的声明:

我还有一些其他变量,但这是与我的问题相关的内容,即:

当我尝试编译此文件时,会出现范围外错误:

...
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