如何重写此代码以避免使用全局?

时间:2013-09-19 19:53:57

标签: c++ namespaces scope globals

我正在编写一些与我们设计组的硬件直接接口的例程。我会尽可能简洁地解释这种情况。

我们的硬件为嵌入式CPU生成各种类型的中断,运行我所描述的固件。由于我们的调试计划的性质,有时我们希望限制服务的中断数量。此中断限制通过外部寄存器接口传递到正在运行的固件中。

SO!我有两个功能: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_limitnum_ints_serviced声明为全局变量。我想知道是否有办法避免使用全局变量。

我对如何做到这一点有一个模糊的想法:

  • num_ints_serviced声明为静态int,以便每次调用inthandler()时都不会重置其值。 (但是,这会带来另一个问题,因为在我们的测试中,我们确实希望将该计数器重置为0.目前只需调用另一个修改全局的函数reset_in_counter()。)
  • 以某种方式混淆了int_limit的范围,以便它可以在interrupt_handler.cpp中本地声明,但是可以从external_command_handler.cpp进行修改。也许使用命名空间?我不确定细节。

我知道最佳实践说你应该避免使用全局变量,但它们有一些用途。我想知道这是否只是其中一种用途,也许我只是让这个问题变得非常困难(毕竟,使用全局变量可以解决这个问题)。

提前感谢任何建议。

2 个答案:

答案 0 :(得分:1)

void inthandler() {
    static int limit = limit_interrupts();
    static int n = 0;
    if (n++ < limit) {
        // do something
    }
}

但是你可能想要一些方法来重置n,这是没有提供的,并且它也只允许设置限制一次,这是第一次调用方法。

答案 1 :(得分:1)

很多人不同意我的意见,但这是我的看法。

如果您所代表的内容实际上是全球性的,那么它应该在您的程序中表示为全局。

  • 此信息表示CPU的属性
  • 您只有一个(CPU)
  • 如果没有重新设计(因此代码重构),您永远不可能拥有多个
  • 通过使程序足够灵活以处理多个CPU配置,几乎无法获得。它会更慢,更大,更容易出错,并且更难调试。

除非我的一个假设是错误的,否则它是合法的全球性。