在 C++ 中使用 C 结构的 malloc
malloc with C struct in C++
我正在尝试在 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 结构?我做错了什么?
基本上评论里都已经说完了
您只是向前声明了 header 中的结构。虽然最好的做法是使用前向声明来减少 header 中的包含依赖项,这些依赖项只需要知道某物是什么(例如结构)而不是它包含什么,但前向声明通常没有多大意义header 中的结构实际上应该定义结构本身。
使用一个结构(包括malloc
)除了需要知道它是一个指针还是一个引用之外,还需要了解该结构的定义。请注意,您的 C++ 文件只能看到包含的内容 header;它看不到 C 文件的内容。因此,header 中的前向声明应该替换为 C 文件中的结构定义,使 C 文件过时,以防它真的只是为了定义结构。
我正在尝试在 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 结构?我做错了什么?
基本上评论里都已经说完了
您只是向前声明了 header 中的结构。虽然最好的做法是使用前向声明来减少 header 中的包含依赖项,这些依赖项只需要知道某物是什么(例如结构)而不是它包含什么,但前向声明通常没有多大意义header 中的结构实际上应该定义结构本身。
使用一个结构(包括malloc
)除了需要知道它是一个指针还是一个引用之外,还需要了解该结构的定义。请注意,您的 C++ 文件只能看到包含的内容 header;它看不到 C 文件的内容。因此,header 中的前向声明应该替换为 C 文件中的结构定义,使 C 文件过时,以防它真的只是为了定义结构。