【问题标题】:How to best fix both warnings(old style c-function declaration isn't a prototype)如何最好地修复两个警告(旧式 c 函数声明不是原型)
【发布时间】:2011-11-14 09:50:58
【问题描述】:

我在一段其他人的代码中修复了一些函数,其中包含许多不带参数的函数。 他们被宣布为

return_type_t func();

而不是 return_type_t func(void);

然后我发现其中一堆被放入带有函数指针的结构数组中。 当我将函数指针固定为 void 时,它给了我另一个警告,因为函数的 1 使用了 char* 而不是 void ptr。

在没有大量重写的情况下,这种事情的最佳解决方案是什么(因为代码很复杂,我主要是在边缘清理它并希望避免改变它的流动方式)?

【问题讨论】:

  • 没有参数的函数声明没有错。规范甚至允许这样做。
  • 当心:当您巧妙地更改类型和函数调用等时,像这样的“清理”通常会引入错误。根据我的经验,这样做是浪费时间。我会添加空格、cmets、额外的单元测试,但不会更多!
  • 不仅仅是定义和/或声明。这也与使用有关。函数是如何调用的?是否所有函数在调用时总是给定一个 char* 作为参数?
  • 似乎只有一个参数被传递,但我会检查。

标签: c function-pointers gcc-warning function-prototypes


【解决方案1】:

struct 定义需要在成员中列出正确的函数类型,如果您想要类型安全,则没有办法。

【讨论】:

    【解决方案2】:

    在 C 中,旧式声明 return_type_t func() 并不意味着 func 不带参数,它意味着未指定其参数(如果有)的数量和类型。您不能只假设您可以在括号内添加void

    在没有看到更多代码的情况下,我的建议是分别研究每个函数并找出每个函数的正确参数数量和类型,然后相应地填写原型。

    【讨论】:

    • 结构数组中除了一个函数之外的所有函数都取 void
    • 好的。相应地填写原型有什么问题?
    【解决方案3】:

    您可以重写所有原型以获取 char*,然后将其转换为 (void) parameter,其中参数无用

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 2017-11-12
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多