How to deal with static storage duration warnings?(如何处理静电存储时长警告?)
问题描述
我完全是一个新手,试图从书本上学习C++。下面的代码可以正常工作并产生预期的输出,但是定义engine
和randomInt
的两行上有警告:"初始化‘Engine’的静电存储时间可能会抛出无法捕获的异常。"
如果我将第7行和第8行放在main()
内,警告将完全消失,但是engine
和randomInt
对getNumber
不可用。
我不知道如何修复警告。另外,也许更重要的是,除了main()
之外,在不同的地方使用randomInt
的正确方法是什么?是否可以在main()
中声明它,然后根据需要将其传递给函数?不知何故,main()
感觉不适合声明这些类型的事情。
我之前问了一个与此类似的问题,但我仍在努力理解,并提供了一个希望有用的示例。
// Loosely based on Fig. 6.12: fig06_12.cpp, C++ How To Program, Ninth Edition
#include <iostream>
#include <iomanip>
#include <random>
std::default_random_engine engine( static_cast<unsigned int>( time(nullptr) ) );
std::uniform_int_distribution<unsigned int> randomInt( 1, 6 );
int getNumber();
int main() {
for ( unsigned int counter = 1; counter <= 10; ++counter ) {
std::cout << std::setw( 10 ) << randomInt( engine );
if ( counter % 5 == 0 )
std::cout << std::endl;
}
std::cout << getNumber() << std::endl;
return 0;
}
int getNumber () {
return randomInt( engine );
}
输出:
/CLionProjects/Warning/cmake-build-debug/Warning
3 5 6 3 3
1 4 2 4 5
2
Process finished with exit code 0
推荐答案
使用全局变量是有问题的,除非绝对必要,否则避免使用它们是常识。详情请参见:
Are global variables bad?
您的问题标题还涉及非全局范围的静电存储持续时间变量(例如静电函数的本地变量);这些变量的问题较小,但也会让您感到头疼,尤其是在多线程工作中。
底线:最好使您的函数只依赖于它们的参数,并尽可能少地产生必要的副作用。让我们使用getNumber()
函数执行此操作:
template <typename Distribution>
typename Distribution::result_type getNumber (
std::default_random_engine& random_engine,
Distribution& distribution)
{
return distribution( random_engine );
}
int main()
{
std::default_random_engine engine( static_cast<unsigned int>( time(nullptr) ) );
std::uniform_int_distribution<unsigned int> randomInt( 1, 6 );
for ( unsigned int counter = 1; counter <= 10; ++counter ) {
std::cout << std::setw( 10 ) << randomInt( engine );
if ( counter % 5 == 0 )
std::cout << std::endl;
}
std::cout << getNumber( engine, randomInt ) << std::endl;
return 0;
}
这篇关于如何处理静电存储时长警告?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何处理静电存储时长警告?
基础教程推荐
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 运算符重载的基本规则和习语是什么? 2022-10-31
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 设计字符串本地化的最佳方法 2022-01-01
- C++,'if' 表达式中的变量声明 2021-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01