【问题标题】:malloc with C struct in C++在 C++ 中使用 C 结构的 malloc
【发布时间】:2021-12-08 21:44:45
【问题描述】:

我正在尝试在 Catch2(一个 C++ 库)中为一个简单的 C 库示例编写一些测试,但我对如何初始化 C 结构有点困惑。

我的 C 头文件如下所示:

struct node;

而我的 C 实现再简单不过了:

struct node {
  int num;
  struct node* next;
}

现在,问题在于测试(在 C++ 中):

#include <catch2/catch.hpp>
extern "C" {
  #include "node.h"
}

TEST_CASE("would it work?", "[foo]") {
  struct node* n = (struct node*) malloc(sizeof(struct node));
}

代码无法编译,因为“struct node 是不完整的类型”。

我的问题是,在这种情况下,如何在 C++ 代码中初始化类似的 C 结构?我做错了什么?

【问题讨论】:

  • 你正在使用sizeof(struct node),但你还没有告诉编译器struct node 中有什么。换句话说,C 实现中的结构定义需要在 C++ 文件中可见。那就是 if 你想为 C++ 文件中的结构分配内存。
  • 在这种情况下,您需要调用 C API 公开的任何函数来创建 node 结构。如果没有任何这样的功能,那么可能需要检查设计或实现?在几乎所有的情况下,你永远不应该在 C++ 中使用malloc,即使是“C”结构。通常,每当您需要进行 C 风格转换时,您都应该将其视为您做错了什么的标志。
  • 如果这是您的真实代码,那么您在结构定义后忘记了分号。
  • 您可能应该将struct node { int num; struct node* next;} 放在 C 标头“node.h”中,而不是 C 实现中。
  • 即使在使用 C 的应用程序中,当您尝试分配结构时也会遇到同样的问题。请向我们展示更多的头文件,或者更正。

标签: c++ c struct malloc


【解决方案1】:

cmets 里基本上都已经说了。

您只是在标题中向前声明结构。虽然最好的做法是使用前向声明来减少头文件中的包含依赖项,这些依赖项只需要知道某物是什么(例如结构)而不是它包含的内容,但在头文件中前向声明结构通常没有多大意义这实际上应该定义结构本身。

使用结构(包括malloc)不仅仅需要知道它是指针还是引用,还需要了解该结构的定义。请注意,您的 C++ 文件只能看到包含的标头的内容;它看不到 C 文件的内容。因此,标头中的前向声明应替换为 C 文件中的结构定义,从而使 C 文件过时,以防它真的只是用于定义结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 2011-01-11
    • 1970-01-01
    • 2012-01-19
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多