我有一個結構,它有一個函數指針作爲成員變量。函數指針將一個指向該結構的指針作爲其參數之一。結構聲明和函數指針之間的循環依賴關係
通過查看此處發佈的用於此類循環依賴關係的解決方案,我使用了前向聲明來編譯。
我仍然有無法初始化結構的問題。下面發佈的是代碼和輸出。
編輯:我早先的MVCE沒有正確地重現問題。我可以通過命名結構而不是僅僅具有一個結構別名來編譯。不完全確定爲什麼。
#include "stdio.h"
//Forward declaration
struct data;
typedef int(*funcPtr) (struct data* a);
typedef struct
{
int a;
int b;
funcPtr foo;
}data;
int foo(data* pData)
{
return 0;
}
static data testData[] = {{1,1,foo}, {0,2,foo},};
int main()
{
printf("Just trying to compile this program\n");
return 0;
}
錯誤輸出 -
compileError.c:20:1: warning: initialization from incompatible pointer type [enabled by default]
static data testData[] = {{1,1,foo}, {0,2,foo},};
^
compileError.c:20:1: warning: (near initialization for \u2018testData[0].foo\u2019) [enabled by default]
compileError.c:20:1: warning: initialization from incompatible pointer type [enabled by default]
compileError.c:20:1: warning: (near initialization for \u2018testData[1].foo\u2019) [enabled by default
備註:它不會在您的示例代碼中顯示,但您的結構不是'struct data'。它是一個未命名的結構類型 - 別名爲'data'。 –
這實際上解決了我在原始代碼中遇到的問題。這MVCE代碼剛剛有一個導致其他答案的錯字。謝謝! –
您的'typedef struct {...} data;'爲未標記的結構類型定義了一個別名'data'。該類型與您之前提到的'struct data'無關。你需要'typedef struct data {...} data;'來獲得編譯的代碼。經修改,這是相當多其他問題的重複。理解'struct tag {...}'與'typedef struct {...}標籤似乎是一個相當普遍的問題。 –