如何处理静态存储持续时间警告?

新手上路,请多包涵

我是一个试图从书中学习 C++ 的新手。下面的代码按预期工作并产生输出,但在定义 enginerandomInt 的两行中有警告:“使用静态存储持续时间初始化“引擎”可能会引发异常那是抓不到的。”

If I put lines 7 and 8 inside of main() , the warnings completely go away, but then engine and randomInt are not available to getNumber

我不知道如何修复警告。此外,也许更重要的是,在 --- 之外的各个地方使用 randomInt main() 正确方法是什么?在 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

原文由 Timothy B. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 655
2 个回答

使用全局变量是有问题的,除非绝对必要,否则避免使用它们是常识。有关详细信息,请参阅:

全局变量不好吗?

您的问题标题还涉及非全局范围的静态存储持续时间变量(例如函数的静态局部变量);这些问题较少,但也会让您有些头疼,尤其是在多线程工作中。

底线:最好让你的函数只依赖于它们的参数,并且尽可能少地产生副作用。让我们用你的 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;
}

原文由 einpoklum 发布,翻译遵循 CC BY-SA 4.0 许可协议

延迟初始化全局变量(例如您正在使用的变量)的一种方法是将它们包装在 get 函数中。

 std::default_random_engine& getEngine()
{
   // Initialized upon first call to the function.
   static std::default_random_engine engine(static_cast<unsigned int>(time(nullptr)));
   return engine;
}

std::uniform_int_distribution<unsigned int>& getRandomInt()
{
   // Initialized upon first call to the function.
   static std::uniform_int_distribution<unsigned int> randomInt(1, 6);
   return randomInt;
}

然后使用 getEngine()getRandomInt() 而不是直接使用变量。

原文由 R Sahu 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题