如何重写此代码以避免使用全局
How do I rewrite this code to avoid using the global?
我正在编写一些直接与我们设计团队的硬件接口的例程。 我将尝试尽可能简洁地解释这种情况。
我们的硬件会为运行我所描述的固件的嵌入式CPU生成各种类型的中断。 由于调试计划的性质,有时我们希望限制所服务的中断数。 此中断限制通过外部寄存器接口传递到正在运行的固件中。
所以! 我有两个功能:inthandler()
和limit_interrupts()
。 它们基本上看起来像这样:
在文件 interrupt_handler.cpp:
void inthandler(){
if (num_ints_serviced < int_limit)
{
...handle interrupt...
num_ints_serviced++;
}
}
在文件 external_command_handler.cpp:
void limit_interrupts(){
int_limit = <read int limit from external register>;
}
目前,我已经int_limit
和num_ints_serviced
声明为全局变量。 我想知道是否有办法避免为此使用全局变量。
我对如何做到这一点有一个模糊的想法:
- 将
num_ints_serviced
声明为静态 int,以便每次调用该inthandler()
时都不会重置其值。 (但是,这带来了另一个问题,因为在测试中的某个时候,我们确实希望将该计数器重置为 0。目前,只需调用另一个函数,reset_in_counter()
修改全局函数。 - 以某种方式弄乱了
int_limit
的范围,以便它可以在interrupt_handler.cpp内本地声明,但从external_command_handler.cpp修改。 也许使用命名空间? 我不确定具体情况。
我知道最佳实践说你应该避免使用全局变量,但它们有一些用途。 我想知道这是否只是其中一种用途,也许我只是让这个问题太难了(毕竟,使用全局变量适用于这种情况)。
提前感谢您的任何建议。
void inthandler() {
static int limit = limit_interrupts();
static int n = 0;
if (n++ < limit) {
// do something
}
}
但是你可能想要某种方法来重置n,这不提供,它也只允许设置一次限制,第一次调用该方法。
很多人不会同意我的观点,但这是我的看法。
如果您所表示的内容实际上是全局的,那么它应该在您的程序中表示为全局。
- 此信息表示 CPU 的属性
- 您只有一个 (CPU)
- 如果没有重新设计(因此进行代码重构),您永远不可能拥有多个
- 使程序足够灵活以处理多个 CPU 配置几乎没有什么好处。它将更慢、更大、更容易出错且更难调试。
这是一个合法的全球性,除非我的一个假设是错误的。
相关文章:
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面
- C++可以在全局范围内拥有代码吗?
- 使用全局 IP 地址时,C++ winsock 2 应用程序中的代码是否必须更改?
- 如果 LTO 中的代码依赖于其构造的副作用,是否允许 LTO 删除未使用的全局对象?
- 在将C全局变量与C 代码链接起来的麻烦
- 在VS代码中使用全局变量时出现"undefined reference to"错误
- Djinni 能否从C++全局函数中生成必要的代码
- 声明全局变量 <vector>,代码将无法成功运行
- Rcpp:从全局环境调用一个R函数,并在C++代码中使用它
- 有没有一种标准方法来确保一段代码在全局范围内执行
- 全局数组在 C 代码中添加到头文件时没有"类型"
- C++错误代码全局命名空间
- 我是否可以在类似于 C# 的 C++ 中创建全局命名空间层次结构,以帮助开发人员使用我们的代码?
- 如何使具有许多全局变量的旧C代码库可重入
- 如何重写此代码以避免使用全局
- EclipseCDT-带有现有代码的新Makefile项目-更改全局默认构建目标
- 如何删除此代码中的全局变量
- 组织sqlite3 C/ c++预处理语句(避免全局代码混乱)
- c++使代码全局可访问
- R调用Cpp代码:全局变量未重新初始化