gpt4 book ai didi

c - 如果没有参数,为什么警告 C4131(旧式函数)不发出警告?

转载 作者:太空宇宙 更新时间:2023-11-04 03:20:22 25 4
gpt4 key购买 nike

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

据我所知,如果不包含任何参数(甚至不包括 void),情况就是这样,即:

void bar()
{
}

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

不需要故障甚至诊断。我觉得这与任何旧式定义一样值得警告。

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

最佳答案

嗯,这里要注意的最重要的事情是编译器仍然必须接受“旧式”函数声明符。语法的相关部分是这样的:

N1570(最新的 C11 草案)§6.7.6 p1:

direct-declarator:
        [...]
        direct-declarator ( identifier-listopt )

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

The use of function definitions with separate parameter identifier and declaration lists (not prototype-format parameter type and identifier declarators) is an obsolescent feature.

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

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

关于c - 如果没有参数,为什么警告 C4131(旧式函数)不发出警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46906143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com