如何在C ++中限制对静态变量的访问?

时间:2016-05-26 17:33:20

标签: c++ static namespaces extern-c

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

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

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

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

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();
...

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

具有static 存储类的变量(例如示例中的变量)是全局的,因为程序中只有一个副本。这与它们的链接无关,它决定了它们的引用位置。无论他们的存储类,功能'局部变量没有链接,这意味着它们只能从函数体中直接访问。

如果你不能修改这个函数,那么它就没有办法让变量c可以在其他地方访问(例如通过暴露指向它的指针),所以测试例程没有其他选择,比如说,在测试之间重置其值或将其读出。因此,如果不同的测试对象必须拥有自己的特定变量副本,那么它必须拥有自己的包含它的函数副本。

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

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

答案 2 :(得分:0)

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

如果您无法使用此函数更改源代码,则可以使用单独的计数器创建包装类。