【发布时间】: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 的应用程序中,当您尝试分配结构时也会遇到同样的问题。请向我们展示更多的头文件,或者更正。