Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';t警告C4131(旧式功能)如果存在警告';没有争论吗?_C_Visual C++_Warnings - Fatal编程技术网

为什么';t警告C4131(旧式功能)如果存在警告';没有争论吗?

为什么';t警告C4131(旧式功能)如果存在警告';没有争论吗?,c,visual-c++,warnings,C,Visual C++,Warnings,我对旧式函数声明警告的理解是,它们并不构成原型,这反过来意味着没有对传递给它的参数进行检查 据我所知,如果没有包含任何参数(甚至不包括void),则会出现这种情况,即: void bar() { } void foo(int x) { bar(x); } 不需要故障,甚至不需要诊断。我觉得这和任何旧式的定义一样值得警惕 但是MSVC++没有警告这种类型的函数定义,为什么?实际上,它们似乎在没有警告的情况下接受上述错误。好吧,这里需要注意的最重要的一点是,编译器仍然必须接受“旧式”函数声

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

据我所知,如果没有包含任何参数(甚至不包括
void
),则会出现这种情况,即:

void bar()
{
}

void foo(int x)
{
   bar(x);
}
不需要故障,甚至不需要诊断。我觉得这和任何旧式的定义一样值得警惕


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

好吧,这里需要注意的最重要的一点是,编译器仍然必须接受“旧式”函数声明器。语法的相关部分如下:

N1570(最新C11草案)§6.7.6 p1

直接声明器:
[…]
直接声明符
标识符列表选项

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

使用带有单独参数标识符和声明列表的函数定义 (不是原型格式参数类型和标识符声明器)是一个过时的特性

因此,这强烈建议编译器至少应该能够对此发出警告。至于为什么一个特定的编译器不这样做,你必须询问制造商或者放弃一个bug报告/特性请求


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

MSVC++有一个历史C模式,但不要期望太多。顾名思义,它实际上是一个C++编译器,C++没有“原型”。我得到了警告C4098:Fo:“Valf”函数,在“C”模式下从VS2013返回一个值。@ JWDOAHAUE代码是误导的,我纠正了这个问题。@ MsAlter甚至非MS编译器不发出任何错误/警告:但这是因为您不使用
-Wold样式定义。启用警告后,它将发出警告。请注意,如果您不以某种方式启用C4131,MSVC++不会发出任何警告。