为什么当我写一个空的主时没有警告

Why is there no warning when I write an empty main?

本文关键字:警告 一个 为什么      更新时间:2023-10-16

如果我写一个像下面这样的程序,g++和Visual studio礼貌地警告我,局部变量a永远不会被使用:

int main()
{
    int a; // An unused variable? Warning! Warning!
}

如果我删除未使用的变量(以使编译器满意),它会给我留下以下程序:

int main()
{
    // An empty main? That's fine.
}

现在,我只剩下一个无用的程序。

也许我错过了一些东西,但是,如果一个未使用的变量足够糟糕,可以发出警告,为什么空程序可以呢?

上面的例子非常简单。但是在现实生活中,如果我有一个主程序空的大程序(因为我忘了在其中放任何东西)。那么发出警告应该是一件好事,不是吗。

也许我在 g++ 或 visual studio 中缺少一个可以在主节点为空时引发警告/错误的选项?

原因很简单,如果 main 中没有 return 语句,则隐式返回标准定义的 EXIT_SUCCESS

所以空的主干很好,不需要返回,不需要函数调用,什么都没有。


要回答为什么GCC不警告你的问题,是因为警告可以帮助你解决常见的错误。将变量保留为未使用可能会导致令人困惑的错误和代码膨胀。

然而,完全

忘记编写一个主函数并不是初学者的常见错误,也不值得警告(因为它也是完全合法的)。

我怀疑很多原因是编译器通常会试图警告潜在的问题,但不一定很明显。

当然,如果你所有的main都包含一个从未使用的变量的定义,这是相当明显的 - 但是如果你定义了16个变量(或其他变量),并且其中一个不再使用,这可能不是那么明显。

main不包含任何内容的情况下,我想main也会发生同样的情况——例如,你可能有一个完整的#ifdef/#elif/等网络,这导致main对于某个特定平台来说完全是空的。我很确定我从来没有遇到过这个,而且我很确定我也从未听说过其他人看到它。至少对我来说,这表明它在实践中可能出现的频率不足以让大多数人关心这种可能性。

如果一个未使用的变量坏到足以引发警告,为什么一个空程序是可以的?

首先,空main不等于空程序。可能存在具有非平凡构造函数/析构函数的静态对象。无论main是否为空,都会调用这些。

其次,人们可以想到很多编译器可以警告的潜在错误,但大多数编译器不会。我认为这个特定的问题并不经常出现(并且需要几秒钟才能弄清楚)。因此,我没有看到专门诊断它的令人信服的理由。

当我清理包含 Informix 4GL 自定义运行程序的继承 C 代码时,我修复了每个警告,设置了警告标志以捕获所有内容,并且有很多警告。

我已经很久没有使用视觉C++了。VC++ 是否无法配置为标记最严重的警告?这可能不是默认设置,但您必须更改。

那么至少可以标记未使用的变量。

在全局意义上,int main()只是程序主要功能的定义,它在完成后返回SUCCESS。main 函数是所有C++程序开始执行的点,与它在源代码中的位置无关。

所以这个:

int main()
{
    // An empty main? That's fine.
    // notice that the "return 0;" part is here by default, whether you wrote it or not 
}

只是返回允许值的函数的定义。所以一切都很好,这就是编译器保持沉默的原因。