1

如果我编写如下程序,g++ 和 Visual Studio 会礼貌地警告我,从未使用过局部变量 a:

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

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

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

现在,我留下了一个无用的程序。

也许我遗漏了一些东西,但是,如果一个未使用的变量足以引发警告,为什么一个空程序可以呢?

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

也许我在 g++ 或 Visual Studio 中缺少一个选项,当主目录为空时会引发警告/错误?

4

5 回答 5

7

这样做的原因很简单,如果其中没有 return 语句,则按照标准的定义main隐式返回。EXIT_SUCCESS

所以一个空的 main 就可以了,不需要返回,不需要函数调用,什么都没有。


要回答为什么 GCC 不警告您的问题是因为警告可以帮助您解决常见错误。不使用变量会导致混乱的错误和代码膨胀。

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

于 2012-05-06T09:50:40.243 回答
1

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

现在可以肯定的是,如果您的所有main变量都包含一个从未使用过的变量的定义,那是相当明显的——但如果您定义了 16 个变量(或其他变量)并且其中一个不再使用,那可能就不那么明显了.

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

于 2012-05-06T17:17:22.890 回答
0

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

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

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

于 2012-05-06T09:53:02.777 回答
0

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

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

那么有可能至少会标记未使用的变量。

于 2012-05-06T10:40:23.027 回答
0

在全局意义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 
}

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

于 2012-05-06T12:41:06.423 回答