0

我有一个名为“count”的 C 函数,如下所示:

void count(){ 
  static int c = 0;
  printf("Counter=%i", c);
  c++;
}

此外,我有一个 Cpp 对象向量,每个对象都调用“计数”函数。由于计数器变量是静态的,一个对象的调用也会增加所有其他对象的计数器值。我真正想要的是每个对象的专用计数器,因为“计数”功能是被测设备并且可能不会更改。我认为这应该可以使用命名空间......有什么想法吗?


我最初的想法是使用命名空间......

namespace c1 {
#ifdef __cplusplus
  extern "C" {
#endif
    #include "count.h"
#ifdef __cplusplus
  }
#endif
}

namespace c2 {
#ifdef __cplusplus
  extern "C" {
#endif
    #include "count.h"
#ifdef __cplusplus
  }
#endif
}

并像这样从 Cpp-Object 内部调用...

if (objNr == 1) c1::count();
else if (objNr == 2) c2::count();
...

它对我不起作用。知道为什么吗?

4

3 回答 3

1

static 具有storage class的变量(例如您的示例中的变量)是全局的,因为程序中的任何位置都只有一个副本。这与它们的链接无关,这决定了它们可以从哪里被引用。无论它们的存储类如何,函数的局部变量都没有链接,这意味着它们只能从函数体内直接访问。

如果你不能修改函数,那么它就无法让变量c在其他地方可访问(例如通过公开指向它的指针),因此测试例程没有替代方法可以在测试之间重置其值或读出来。因此,如果不同的测试对象必须有自己的那个特定变量的副本,那么它们必须有自己的包含它的函数的副本。

实现这一目标的最简单和最通用的方法是在单独的程序中运行每个测试对象。也可以玩游戏,例如动态加载和卸载包含该函数的库(根据@VadimKey),但这取决于标准 C 或 C++ 之外的功能,并且它使测试环境与大多数该函数可能会看到的其他环境。

否则,如果多个对象必须在同一个测试程序的同一次运行中运行测试,那么就没有办法让它们拥有函数静态变量的私有副本。您最好的选择可能只是构建您的测试以适应它。

于 2016-05-26T18:03:29.197 回答
1

所问的问题无法解决。如果函数是不可修改的,则无法开始计算单个实例。

于 2016-05-26T17:49:07.140 回答
0

如果您可以访问源代码,请以某种方式更改它以使该计数器外部化。要么将其作为参数传递,要么创建一个以 counter 作为成员的类。

如果您不能使用此函数更改源代码,那么您可以创建一个带有单独计数器的包装类。

于 2016-05-26T17:42:30.910 回答