2008-12-16 70 views
3

GCC 3.4.5(MinGW的版本)产生一个警告:参数具有不完全的类型为以下C代码的第2行:Ç的typedef:参数具有不完整的类型

struct s; 
typedef void (* func_t)(struct s _this); 
struct s { func_t method; int dummy_member; }; 

有一种方法来解决这个(或者至少隐藏警告)而不将方法参数的签名更改为(struct s *)?至于为什么像这样会有用:我目前正在修补一个面向对象的框架; 'method'是调度表中的一个条目,并且由于该框架的特定设计,按值传递'_this'而不是通过引用(因为它通常完成)是合理的...

+0

哪个版本的GCC?这段确切的代码(加上一个主函数)给我提供了4.3.2版本的Ubuntu中没有的GCC警告。是否还有其他涉及导致警告的内容? – Sean 2008-12-16 15:44:56

+0

我目前坚持使用MinGW版本的gcc,它是3.4.5(?)。但很高兴知道问题可能最终会消失... – Christoph 2008-12-16 15:51:22

+0

海湾合作委员会3.4.6抱怨下-Wall; GCC 4.3.2不支持 - Solaris 10. – 2008-12-16 16:34:53

回答

0

该警告似乎是当前MinGW版本的gcc的一个错误。相反的是亚当说,这是有效 C99 - 6.7.5.3节,第12款明确允许这样的:

如果函数声明不是函数的定义的一部分,参数可能具有不完整的类型和可以在它们的声明符说明符序列中使用[*]符号来指定可变长度的数组类型。

似乎没有办法指导(这个版本)GCC不打印此警告 - 至少找不到该工作开关 - 所以我只是忽视它现在。

-1

你想用函数指针调用它。为什么不使用void指针呢?

typedef void (*func_t)(void*); 

你可能也可以传递一个松散类型的函数指针;我手边没有编译器。

typedef void (*func_t)(void (*)()); 
1

你不能完全做到这一点很容易 - 根据C99 standard,第6.7.5.3条第4款:

调整后,在参数类型列表中的参数的函数声明说是 该函数的定义的一部分不应该有不完整的类型。

选项包括,因此,具有的功能采取的指针结构,或采取一个指向略微不同的类型的函数,例如函数服用未指定的参数:

typedef void (* func_t)(struct s*); // Pointer to struct 
typedef void (* func_t)(void *);  // Eww - this is inferior to above option in every way 
typedef void (* func_t)();   // Unspecified parameters