2011-12-17 86 views
1

(代碼示例尚未進行測試 - 只要是例如)警告:通過函數表初始化從兼容的指針類型在C

我有幾個聲明像這樣:

void (* const a[])(void) = {func1, func2}; 
void func1() {}; 
void func2() {}; 
a[0](); 

即編譯(如果它是真實的代碼...),應該運行func1。

但是,如果我想傳遞參數,如:

a[0](int 10); 

然後我改變我的聲明:

void (* const a[])(int) = {func1, func2}; 
void func1(int foo) {}; 
void func2(int foo) {}; 
a[0](10); 

這也編譯,但我得到以下警告:

warning: initialisation from incompatible pointer type. 

生成的代碼也運行良好,但我懷疑聲明是錯誤的。 我可以找到幾個關於如何構建函數表的例子,這些函數表不會傳遞參數,但我正在努力尋找一個示例來展示如何使用它。

+0

請使您的[代碼示例](http://sscce.org/)完整和代表(這並不意味着發佈您的所有代碼)。 – outis 2011-12-17 19:33:17

+0

對不起,這個不好的例子;根據以下公認的答案,寫了一個正確的答案,然後立即找到答案。 – 2011-12-19 15:21:15

回答

3

最有可能的聲明func1func2宣稱他們以void作爲參數,而不是採取int。您可能有

void func1(void); 
void func2(void); 

在某些頭文件中。相反,你需要

void func1(int); 
void func2(int); 

這是因爲申報

void (*const a[])(int) 

意味着a正在int和返回void函數指針數組。

+0

在更大的代碼中,我有更多的功能,其中一個不接受參數。衛生署。 – 2011-12-18 08:35:15

3

當您初始化a時,func1func2未被聲明,因此它們的默認類型聲明爲int()。在初始化a之前聲明func1func2

void func1(int); 
void func2(int); 

void (* const a[])(int) = {func1, func2}; 
void func1(int foo) {}; 
void func2(int foo) {}; 
a[0](10); 
+1

我們並不確定他們沒有申報。這只是一個文件的小片段,可以很容易地在包含的頭文件中聲明'func1'和'func2'。 – 2011-12-17 19:28:10

+2

@AdamMihalcin:我們也不知道它們是被聲明的,但是聲明不正確。真正的問題是代碼示例不完整。 – outis 2011-12-17 19:32:47

+1

絕對正確 – 2011-12-17 19:34:32

2

我相信具有typedef -s用於定義函數的簽名使代碼更具可讀性。那麼,爲什麼不:

typedef void signature_t(int); 
void foo1(int); 
void foo2(int); 
const signature_t* funarray[] = { foo1, foo2 }; 
+0

+1這樣可以避開'const'。 – 2011-12-17 19:58:10

相關問題