警告:通过函数表初始化从兼容的指针类型在C

警告:通过函数表初始化从兼容的指针类型在C

问题描述:

(代码示例尚未进行测试 - 只要是例如)警告:通过函数表初始化从兼容的指针类型在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

最有可能的声明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

当您初始化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

我相信具有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