C typedef:参数类型不完整

时间:2008-12-16 15:10:55

标签: c gcc

GCC 3.4.5(MinGW版本)产生警告:参数对于以下C代码的第2行具有不完整类型:

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

有没有办法解决这个问题(或至少隐藏警告)而不将方法参数的签名更改为(struct s *)?

注意:
至于为什么这样的事情会有用:我正在修补面向对象的框架; 'method'是调度表中的一个条目,由于框架的特殊设计,通过值传递'_this'而不是通过引用传递(通常是这样)......

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

答案 2 :(得分:0)

隐藏警告通常非常简单 - 只需查看特定编译器的帮助。

http://developer.apple.com/documentation/DeveloperTools/gcc-4.0.1/gcc/index.html#//apple_ref/doc/uid/TP40001838

请注意,抑制警告通常不是我所倡导的。

答案 3 :(得分:0)

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

  

如果函数声明符不是该函数定义的一部分,则参数可能具有不完整的类型,并且可能在其声明符说明符序列中使用[*]表示法来指定可变长度数组类型。

似乎没有办法指示(此版本的)gcc不打印此警告 - 至少找不到有效的开关 - 所以我现在暂时忽略它

答案 4 :(得分:-1)

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

typedef void (*func_t)(void*);

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

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