编译器警告(等级 1)C4930

“prototype”:未调用原型函数(是否是有意用变量定义的?)

编译器检测到未使用的函数原型。 如果原型用作变量声明,请删除左括号/右括号。

下面的示例生成 C4930:

// C4930.cpp
// compile with: /W1
class Lock {
public:
   int i;
};

void f() {
   Lock theLock();   // C4930
   // try the following line instead
   // Lock theLock;
}

int main() {
}

当编译器无法区分函数原型声明和函数调用时,也会发生 C4930。

下面的示例生成 C4930:

// C4930b.cpp
// compile with: /EHsc /W1

class BooleanException
{
   bool _result;

public:
   BooleanException(bool result)
      : _result(result)
   {
   }

   bool GetResult() const
   {
      return _result;
   }
};

template<class T = BooleanException>
class IfFailedThrow
{
public:
   IfFailedThrow(bool result)
   {
      if (!result)
      {
         throw T(result);
      }
   }
};

class MyClass
{
public:
   bool MyFunc()
   {
      try
      {
         IfFailedThrow<>(MyMethod()); // C4930

         // try one of the following lines instead
         // IfFailedThrow<> ift(MyMethod());
         // IfFailedThrow<>(this->MyMethod());
         // IfFailedThrow<>((*this).MyMethod());

         return true;
      }
      catch (BooleanException e)
      {
         return e.GetResult();
      }
   }

private:
   bool MyMethod()
   {
      return true;
   }
};

int main()
{
   MyClass myClass;
   myClass.MyFunc();
}

在上面的示例中,采用零个参数的方法的结果作为参数传递给未命名的局部类变量的构造函数。 可以通过命名局部变量或将方法调用前缀与对象实例以及相应的指针到成员运算符来消除调用的歧义。