为什么不警告C4131(旧式函数)警告是否没有参数?

时间:2017-10-24 08:55:50

标签: c visual-c++ warnings

我对旧式函数声明的警告的理解是它们不构成原型,这反过来意味着检查传递给它的参数没有完成。

据我所知,如果没有参数(甚至不包括void)也是如此,那就是:

void bar()
{
}

void foo(int x)
{
   bar(x);
}

不需要失败甚至诊断。我觉得这应该得到与任何旧式定义一样多的警告。

但MSVC ++没有警告这种类型的函数定义,为什么?他们实际上似乎在没有警告的情况下接受上述错误。

1 个答案:

答案 0 :(得分:1)

嗯,最值得注意的是,编译器仍然必须接受“旧式”函数声明符。语法的相关部分是:

N1570(最新C11草案)§6.7.6第1页

  

直接声明符:
  [...]
   direct-declarator ( 标识符列表 opt )

但它已被标记为过时(§6.11.6p1):

  

使用具有单独参数标识符和声明列表的函数定义   (不是prototype-format参数类型和标识符声明符)是一个过时的功能。

所以,这强烈建议编译器至少应该能够警告它。至于为什么特定编译器不这样做,你必须询问制造商或删除错误报告/功能请求。

特别是对于MSVC,我只能猜测这是微软关注C ++的另一个症状。在C ++中,空参数列表确实表示“此函数没有参数”,并且很可能Microsoft只是重用代码来生成C ++的警告。但同样,这是在猜测。