为什么当我写一个空的主时没有警告
Why is there no warning when I write an empty main?
如果我写一个像下面这样的程序,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
}
只是返回允许值的函数的定义。所以一切都很好,这就是编译器保持沉默的原因。
- G++ 发出警告,要求删除一个代码的数组,但不删除另一个代码的数组
- 将类成员函数作为线程调用到另一个类成员函数时发出警告消息
- C++ - 在我尝试制作一个简单的计算器时有一个"uninitialized local variable y used"警告
- C++ 警告:在一个声明中将截断从双精度初始化为浮点数,但在另一个声明中则不初始化
- 从 int 中剥离位时,编译器会警告一个转换,但不警告其他转换.有解决方法吗?
- 一个语句中没有多个 cout 的错误/警告
- 我正在尝试在我的类中创建一个静态成员,但编译器警告我它是未定义的
- 为什么 CLion 给我一个警告?
- "used after it was moved [bugprone-use-after-move]"警告在这里是一个真正的问题吗?
- 该代码段在 Colliru 中编译时带有警告,但在 Ideone 中正常编译.哪一个是正确的
- 为什么当我写一个空的主时没有警告
- 为什么'control reaches end of non-void function'只是一个警告?合法吗?
- 需要一个关于用const参数重写函数的警告
- 为什么我得到一个未对齐指针的警告,而不是一个引用
- 我如何创建一个类,可以给我C4251警告
- 一个定义规则警告
- c++代码给出了一个奇怪的警告
- 使用一个方法实现不同类型赋值的优雅方式,并且没有警告
- Int到float的转换会产生一个警告
- C在运行时警告一个问题