c++11时间非引用局部变量
c++11 chrono unreferenced local variable
当我使用以下代码执行某个操作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_*
)。
相关文章:
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- 返回对局部变量 - C++ 的引用
- 警告 C4101 未引用的局部变量
- 现代编译器会优化只引用对象子集的局部变量吗
- 右值引用和局部变量的移动
- 结构数组 - 未引用的局部变量
- 返回对局部变量的引用是否正常工作?
- 为什么 ++ 运算符触发器返回对局部变量警告的引用
- 三元运算符:编译器不发出局部变量警告的返回引用
- 为什么 C++ 编译器不警告返回对局部变量的引用
- 变量循环范围会导致返回局部变量的地址引用
- 通过引用返回局部变量
- 为什么我得到未引用的局部变量
- 返回由引用指定的引用局部变量
- 返回静态局部变量作为引用
- 没有返回对局部变量的引用的编译器警告
- 为什么在这段代码中返回对局部变量的引用
- 引用与设置局部变量
- 通过引用参数将局部变量分配给
- 捕获和调试对移动lambda内部局部变量引用的无效使用