2016-04-08 41 views
0

我有一個結構,它有一個函數指針作爲成員變量。函數指針將一個指向該結構的指針作爲其參數之一。結構聲明和函數指針之間的循環依賴關係

通過查看此處發佈的用於此類循環依賴關係的解決方案,我使用了前向聲明來編譯。

我仍然有無法初始化結構的問題。下面發佈的是代碼和輸出。

編輯:我早先的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 
+2

備註:它不會在您的示例代碼中顯示,但您的結構不是'struct data'。它是一個未命名的結構類型 - 別名爲'data'。 –

+0

這實際上解決了我在原始代碼中遇到的問題。這MVCE代碼剛剛有一個導致其他答案的錯字。謝謝! –

+1

您的'typedef struct {...} data;'爲未標記的結構類型定義了一個別名'data'。該類型與您之前提到的'struct data'無關。你需要'typedef struct data {...} data;'來獲得編譯的代碼。經修改,這是相當多其他問題的重複。理解'struct tag {...}'與'typedef struct {...}標籤似乎是一個相當普遍的問題。 –

回答

2

foo功能是不符合funcPtr - 它返回一個int,而不是一個void

此外,你的變量被聲明爲一個數組,但你用一個值初始化它 - 刪除[]

+0

你可以讓數組有一個元素,但是你應該完全支持你的初始化器:'data testData [] = {{1,1,foo},};'。這可能是將真實程序轉換爲MCVE的副作用。 –

+0

@JonathanLeffler - 在我看來,這裏並沒有故意使用數組。 – Amit

+0

是的,我應該可能使用多個值。我真正的程序使用數組。 –

1

您可以定義一個結構數據的數組,但僅用一個元素對其進行初始化。如果這是無意的,刪除「[]」:

data testData = {1,1,foo}; 

如果需要一個數組,初始化一個完全支撐數組初始化:

data testData[] = { {1,1,foo} }; 

另外,檢查你的成員函數簽名。聲明和實施應返回voidint