【问题标题】:How to restrict access to static variables in C++?如何限制对 C++ 中静态变量的访问?
【发布时间】:2016-09-24 20:29:24
【问题描述】:

我有一个名为“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();
...

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

【问题讨论】:

  • 所以你说的代码不能改变?没有意义。每次调用它都会递增。期间。
  • 如果您想为每个对象设置一个专用计数器,请将该计数器添加为该类的成员。
  • 此外,在函数内声明的变量没有链接,因此您无法从其声明函数之外的任何地方直接访问它们。例如,这可以防止您的测试代码在测试之间重置变量。
  • 我投票结束这个问题,因为这个问题没有可能的解决方案。
  • 我只是想知道,你在这里测试什么......

标签: c++ static namespaces extern-c


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • OP 评论说“'count'-function 是 Device-Under-Test 并且可能不会更改。”
      • @JohnBollinger 那么只有一个简单的解决方案将每个测试作为单独的进程运行。或者,创建一个共享库并每次加载/卸载它......
      猜你喜欢
      • 1970-01-01
      • 2010-10-19
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      相关资源
      最近更新 更多