C++ 如何在C++;?

C++ 如何在C++;?,c++,static,namespaces,extern-c,C++,Static,Namespaces,Extern C,我有一个名为“count”的C函数,它如下所示: void count(){ static int c = 0; printf("Counter=%i", c); c++; } 此外,我还有一个Cpp对象向量,每个对象调用“count”函数。由于计数器变量是静态的,因此一个对象的调用也会增加所有其他对象的计数器值。我实际上想要的是一个专用计数器,用于每个对象,并限制“计数”功能是正在测试的设备,不能更改。我认为这应该是可能的使用名称空间。。。有什么想法吗 我最初的想法是使用名称

我有一个名为“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对象内部调用,如下所示

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

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

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


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

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


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

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

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

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

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

实现这一点的最简单和最通用的方法是在单独的程序中运行每个测试对象。也可以玩游戏,例如动态加载和卸载包含该函数的库(每@ VadimKey),但是这取决于标准C或C++之外的特性,并且使测试环境与大多数其他函数可能看到的环境不同。
否则,如果多个对象必须在同一测试程序的同一次运行中运行测试,则无法使它们具有函数静态变量的私有副本。您最好的选择可能是构造测试以适应这种情况。

带有
静态
存储类的变量,例如您的示例中的变量,在程序中任何地方都只有一个副本的意义上是全局的。这与它们的链接无关,而链接决定了它们的引用位置。无论其存储类别如何,函数的局部变量都没有链接,这意味着它们只能从函数体内部直接访问

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

实现这一点的最简单和最通用的方法是在单独的程序中运行每个测试对象。也可以玩游戏,例如动态加载和卸载包含该函数的库(每@ VadimKey),但是这取决于标准C或C++之外的特性,并且使测试环境与大多数其他函数可能看到的环境不同。
否则,如果多个对象必须在同一测试程序的同一次运行中运行测试,则无法使它们具有函数静态变量的私有副本。您最好的选择可能是构造测试以适应这种情况。

那么您所说的代码不能更改吗?没有道理。它将在每次调用时递增。句点。如果您想为每个对象添加一个专用计数器,请将该计数器添加为类的成员。此外,函数内声明的变量没有链接,因此您无法从其声明函数外的任何位置直接访问它们。这就防止了,比如说,让你的测试代码在测试之间重置变量。我投票将这个问题作为离题题来结束,因为这个问题没有可能的解决方案。我只是想知道,你在这里测试的是什么……那么你说的是什么?呈现的代码不能更改?没有道理。它将在每次调用时递增。句点。如果您想为每个对象添加一个专用计数器,请将该计数器添加为类的成员。此外,函数内声明的变量没有链接,因此您无法从其声明函数外的任何位置直接访问它们。比如说,这可以防止测试代码在测试之间重置变量。我投票将这个问题作为离题题来结束,因为这个问题没有可能的解决方案。我只是想知道,你在这里测试的是什么……OP评论说,“count”函数是正在测试的设备,可能不会被更改。@JohnBollinger然后只有一个简单的选项