【问题标题】:Why is compiler not flagging this as an Error instead of warning?为什么编译器不将此标记为错误而不是警告?
【发布时间】:2012-07-08 21:06:48
【问题描述】:
#include <iostream>

using namespace std;

class test{
public:
    test() { cout<<"CTOR"<<endl; }
    ~test() { cout<<"DTOR"<<endl; }
};

int main()
{
 test testObj();
 cout<<"HERE"<<endl;

} 

输出:

HERE

编译器跳过“test testObj();”行并编译其余部分并发出警告,运行时将生成输出。警告是“在 VC++ 2008 中未调用原型函数(是否打算定义变量?)。为什么它不抛出错误?

【问题讨论】:

  • ... 因为这不是错误。这是有效的代码。
  • 那为什么那条线没有命中呢?可能我很困惑?上面的 sn-p 应该发生什么?
  • @rocky:这是一个声明,不可执行。那么被“击中”是什么意思呢?
  • @BenVoigt:好的。如何使用或初始化这个 testObj 变量?
  • @rocky:在您的代码中,testObj 不是变量,而是函数。这就是警告告诉你的。

标签: c++ visual-studio-2008 visual-c++


【解决方案1】:

因为这不是错误。

您的代码违反了most-vexing parse(总而言之,test testObj(); 没有定义变量,它声明了一个函数)。

【讨论】:

  • 这并不是您链接到的页面中描述的真正令人烦恼的解析。那将是test testObj(test());。
  • 对一个有:它应该告诉你什么?你的代码是 100% 正确的吗?另一方面:我很确定 Clang 在这种情况下会发出警告......(Clang >>> GCC)
  • @CharlesBailey:OP 只是一个更简单的例子,对吧?基本原则是它被解释为函数声明,而不是变量定义。
  • 是的,它更简单,所以没有那么麻烦。 最令人烦恼的解析通常需要在初始化表达式周围使用额外的括号来消除歧义,这与此处所需的简单修复有点不同。
  • @CharlesBailey:我不知道,你的例子并不像我个人最喜欢的 std::vector&lt;int&gt; v(std::istream_iterator&lt;int&gt;(cin), std::istream_iterator&lt;int&gt;()); 那样令人烦恼;-)
【解决方案2】:

很简单,因为声明您声明的函数并不是错误。不过,警告应该足够有用。

【讨论】:

    【解决方案3】:

    从 Main 中的构造函数调用中删除 ()

    int main()
    {
        test testObj;
        cout<<"HERE"<<endl;
    } 
    

    【讨论】:

      猜你喜欢
      • 2019-04-18
      • 1970-01-01
      • 2013-02-21
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      相关资源
      最近更新 更多