如果我编写类似下面的程序,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为空时会出现警告/错误?
答案 0 :(得分:7)
原因很简单,如果main
中没有return语句,它会隐式返回EXIT_SUCCESS
,如标准所定义。
所以空主要没问题,不需要返回,不需要函数调用,没有。
要回答为什么GCC不警告的问题,是因为警告是帮助你常见错误。保留未使用的变量可能会导致混淆错误,并导致代码膨胀。
然而,完全忘记写一个主函数并不是一个常见的错误,除了初学者之外什么也不是值得警告的(因为它完全合法)。
答案 1 :(得分:1)
我怀疑很多编译器通常会尝试警告可能出现问题的事情,但并非 。
现在肯定的是,如果 all 你的main
包含一个从未使用的变量的定义,这是相当明显的 - 但是如果你已经定义了16个变量(或其他)其中一个不再使用,可能不那么明显。
如果main
不包含任何内容,我假设同样可能会出现空main
- 例如,您可以拥有整个网络{{ 1}} / #ifdef
/ etc。导致#elif
对某个特定平台完全为空。我很确定我从来没有碰过这个,而且我很确定我从来没有听说过其他任何人都看过它。至少在我看来,这表明在实践中可能并不经常出现,大多数人都不太关心这种可能性。
答案 2 :(得分:0)
如果未使用的变量足以引发警告,为什么空程序可以正常?
首先,空main
不等于空程序。可能存在具有非平凡构造函数/析构函数的静态对象。无论main
是否为空,都会调用它们。
其次,人们可以想到编译器可以警告的许多潜在错误,但大多数编译器都没有。我认为这个特别的不经常出现(需要几秒钟才能搞清楚)。因此,我没有看到具体诊断它的令人信服的案例。
答案 3 :(得分:0)
当我清理包含Informix 4GL自定义运行程序的继承C代码时,我修复了设置警告标志的每个警告以捕获所有内容,并且有很多警告。
我很久没有使用过Visual C ++了。 VC ++不能配置为标记最严重的警告?它可能不是默认设置,但您必须更改。
然后至少可以标记未使用的变量。
答案 4 :(得分:0)
在全局意义上,int main()
只是程序主要功能的定义,在完成时返回SUCCESS
。
主要功能是所有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
}
只是一个返回允许值的函数的定义。 所以一切都很好,这就是编译器保持沉默的原因。