警告:通过c中的函数表从不兼容的指针类型初始化

时间:2011-12-17 19:18:35

标签: 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.

结果代码也运行良好,但我怀疑声明是错误的。 我可以找到几个关于如何构建不传递参数的函数表但是很难找到一个示例来说明如何使用参数的示例。

3 个答案:

答案 0 :(得分:3)

func1func2的声明很可能将它们声明为void作为参数,而不是int。你可能有

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

在某个头文件中。相反,你需要

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

这是因为声明

void (*const a[])(int)

表示a是一个带int并返回void的函数指针数组。

答案 1 :(得分:3)

在您初始化a时,未声明func1func2,因此它们具有int ()的默认类型声明。在初始化func1之前声明func2a

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

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

答案 2 :(得分:2)

我相信用typedef - 来定义函数的签名会使代码更具可读性。那么为什么不呢:

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