【问题标题】:C typedef: parameter has incomplete typeC typedef:参数类型不完整
【发布时间】:2008-12-16 15:10:55
【问题描述】:

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' 是有意义的(通常是这样做的)...

【问题讨论】:

  • GCC 的哪个版本?确切的 sn-p 代码(加上一个主要功能)没有给我 Ubuntu 附带的 GCC 4.3.2 的警告。是否还有其他导致警告的原因?
  • 我目前坚持使用 MinGW 版本的 gcc,即 3.4.5(?)。但很高兴知道问题最终可能会消失......
  • GCC 3.4.6 在 -Wall 下抱怨; GCC 4.3.2 没有 - Solaris 10。
  • 你会如何使用这个结构/函数?这是一个最大限度地减少的例子(通常是一件好事——尽管你可能已经在最小化方面走了一步),还是一个捏造的测试用例?我看不出如何从这样的结构或函数中获得有用的结果。
  • 为什么按值传递有意义?

标签: c gcc


【解决方案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

【讨论】:

  • 但是没有那个函数的定义,是不是……只有声明?
  • 谢谢。您的最后一个建议实际上是我想要的,但是我会丢失所有类型信息(并在使用 -Wstrict-prototypes 编译时收到警告) - 所以我很可能会坚持使用我得到的版本......跨度>
  • 我认为乔纳森是对的。它可能在 c 中无效(我不知道。我只知道在 C++ 中它是有效的),但是您向我们展示的语句并没有使它无效。在他的代码中。函数声明符不是定义的一部分。它只是声明函数。
【解决方案2】:

【讨论】:

    【解决方案3】:

    隐藏警告通常很容易 - 只需查看特定编译器的帮助即可。

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

    请注意,我通常不提倡禁止显示警告。

    【讨论】:

    • 嗯,我知道。但是提出问题的人询问了隐藏警告的问题。我只是指出了如何做到这一点。回答他的那部分问题而被否决对我来说似乎有点不公平......
    【解决方案4】:

    警告似乎是当前 MinGW 版本的 gcc 的错误。与 Adam 所说的相反,它有效的 C99 - 第 6.7.5.3 节第 12 节明确允许这样做:

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

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

    【讨论】:

      【解决方案5】:

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

      typedef void (*func_t)(void*);
      

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

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

      【讨论】:

      • "你想用函数指针调用它" 实际上,我没有。 struct s 也包含其他成员 - 我会在一分钟内澄清这个问题......
      猜你喜欢
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      • 2023-03-05
      • 1970-01-01
      • 2011-08-25
      • 2016-10-06
      • 2017-04-14
      相关资源
      最近更新 更多