c++ - 从 C++ 析构函数调用自定义免费 C 例程?

标签 c++ c memory free destructor

我有一个名为 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/

相关文章:

c - 使用 seq_file 构建 Linux/proc 文件驱动程序

c - C 中带有结构体指针的链表节点

无法在 Ubuntu 中捕获 SIGPIPE 信号

java - erlang 可以处理多少并发 http 请求

c# - 防止在渲染之前复制 C# WPF BitmapSource 字节

c++ - 什么时候为对象设置虚拟表指针(在 C++ 中)?

c++ - 碰撞时物体穿墙

c++ - MATLAB代码和C(C++)用IPP代码计算结果的区别

c++ - 如何在不破坏死键支持的情况下使用 ToUnicode?

linux - 查看为bash进程分配了多少虚拟内存