我正在嘗試在 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 結構?我究竟做錯了什么?
uj5u.com熱心網友回復:
基本上所有內容都已經在評論中說了。
您只是在標題中向前宣告結構。雖然最好的做法是使用前向宣告來減少頭檔案中的包含依賴,這些依賴只需要知道什么是什么(例如一個結構)而不是它包含什么,但在頭中前向宣告結構通常沒有多大意義這實際上應該定義結構本身。
使用結構(包括malloc)而不僅僅是需要知道它是指標還是參考,還需要了解該結構的定義。請注意,您的 C 檔案只能看到包含頭檔案的內容;它看不到 C 檔案的內容。因此,標頭中的前向宣告應該由 C 檔案中的結構定義替換,從而使 C 檔案過時,以防它真的只是為了定義結構。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/331753.html
上一篇:帶有模板方法id的模板類
