警告:通过函数表初始化从兼容的指针类型在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.
生成的代码也运行良好,但我怀疑声明是错误的。 我可以找到几个关于如何构建函数表的例子,这些函数表不会传递参数,但我正在努力寻找一个示例来展示如何使用它。
最有可能的声明func1
和func2
宣称他们以void
作为参数,而不是采取int
。您可能有
void func1(void);
void func2(void);
在某些头文件中。相反,你需要
void func1(int);
void func2(int);
这是因为申报
void (*const a[])(int)
意味着a
正在int
和返回void
函数指针数组。
在更大的代码中,我有更多的功能,其中一个不接受参数。卫生署。 – 2011-12-18 08:35:15
当您初始化a
时,func1
和func2
未被声明,因此它们的默认类型声明为int()
。在初始化a
之前声明func1
和func2
。
void func1(int);
void func2(int);
void (* const a[])(int) = {func1, func2};
void func1(int foo) {};
void func2(int foo) {};
a[0](10);
我们并不确定他们没有申报。这只是一个文件的小片段,可以很容易地在包含的头文件中声明'func1'和'func2'。 – 2011-12-17 19:28:10
@AdamMihalcin:我们也不知道它们是被声明的,但是声明不正确。真正的问题是代码示例不完整。 – outis 2011-12-17 19:32:47
绝对正确 – 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 };
+1这样可以避开'const'。 – 2011-12-17 19:58:10
请使您的[代码示例](http://sscce.org/)完整和代表(这并不意味着发布您的所有代码)。 – outis 2011-12-17 19:33:17
对不起,这个不好的例子;根据以下公认的答案,写了一个正确的答案,然后立即找到答案。 – 2011-12-19 15:21:15