如何处理静电存储时长警告?

2022-02-26 00:00:00 global-variables c++ c++11

我完全是一个新手,试图从书本上学习C++。下面的代码可以正常工作并产生预期的输出,但是定义enginerandomInt的两行上有警告:"初始化‘Engine’的静电存储时间可能会抛出无法捕获的异常。"

如果我将第7行和第8行放在main()内,警告将完全消失,但是enginerandomIntgetNumber不可用。

我不知道如何修复警告。另外,也许更重要的是,除了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;
}

相关文章