c++11时间非引用局部变量

c++11 chrono unreferenced local variable

本文关键字:局部变量 引用 时间 c++11      更新时间:2023-10-16

当我使用以下代码执行某个操作1秒时,我会从Visual Studio收到C4101警告:警告C4101:'highResClock':未引用的本地变量。我不明白为什么我在声明后两次使用highResClock时会收到这个警告。

chrono::high_resolution_clock highResClock;
chrono::duration<int, ratio<1, 1> > dur(1);
chrono::time_point<chrono::high_resolution_clock> end = highResClock.now() + dur;
while (highResClock.now() < end)
{
    // do something repeatedly for 1 second
}

编辑:Visual Studio发出的警告似乎是因为std::chrono::high_resolution_clock::now()是一个静态函数。现在不需要highResClock变量来访问(),尽管这是我选择使用的特定方法。Visual Studio似乎将其解释为未使用该变量。当我使用以下内容时,我不再收到任何警告:

chrono::duration<int, ratio<1, 1> > dur(1);
chrono::time_point<chrono::high_resolution_clock> end = chrono::high_resolution_clock::now() + dur;
while (chrono::high_resolution_clock::now() < end)
{
    // do nothing
}

您在类的实例上使用静态方法,这会导致以下警告:

但是,当通过类的实例调用静态成员函数时,也会出现此警告:

// C4101b.cpp
// compile with:  /W3
struct S {
   static int func()
   {
      return 1;
   }
};
int main() {
   S si;   // C4101, si is never used
   int y = si.func();
   return y;
}

在这种情况下,编译器使用关于si的信息来访问静态函数,但不需要类的实例来调用静态函数;因此出现警告[emphasis added]。

MSDN文章还提供了如何消除警告的附加信息:

要解决此警告,您可以:

  • 添加一个构造函数,编译器将在对func的调用中使用si的实例。

  • func的定义中删除static关键字。

  • 显式调用静态函数:int y = S::func();

由于您使用的是标准类,因此应该使用后者,例如std::chrono::high_resolution_clock::now():

auto end = std::chrono::high_resolution_clock::now() + std::chrono::seconds(1);
while(std::chrono::high_resolution_clock::now() < end)
{
    // do nothing
}

也就是说,您不应该使用繁忙循环来等待,还有其他方法可以做到这一点(例如,条件变量或std::this_thread::sleep_*)。