我是一个试图从书中学习 C++ 的新手。下面的代码按预期工作并产生输出,但在定义 engine
和 randomInt
的两行中有警告:“使用静态存储持续时间初始化“引擎”可能会引发异常那是抓不到的。”
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 许可协议
使用全局变量是有问题的,除非绝对必要,否则避免使用它们是常识。有关详细信息,请参阅:
全局变量不好吗?
您的问题标题还涉及非全局范围的静态存储持续时间变量(例如函数的静态局部变量);这些问题较少,但也会让您有些头疼,尤其是在多线程工作中。
底线:最好让你的函数只依赖于它们的参数,并且尽可能少地产生副作用。让我们用你的
getNumber()
函数来做这个: