我有一个名为“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();
...
它对我不起作用。知道为什么吗?
答案 0 :(得分:1)
问题无法解决。如果函数是不可修改的,则无法开始计算单个实例。
答案 1 :(得分:1)
具有static
存储类的变量(例如示例中的变量)是全局的,因为程序中只有一个副本。这与它们的链接无关,它决定了它们的引用位置。无论他们的存储类,功能'局部变量没有链接,这意味着它们只能从函数体中直接访问。
如果你不能修改这个函数,那么它就没有办法让变量c
可以在其他地方访问(例如通过暴露指向它的指针),所以测试例程没有其他选择,比如说,在测试之间重置其值或将其读出。因此,如果不同的测试对象必须拥有自己的特定变量副本,那么它必须拥有自己的包含它的函数副本。
实现这一目标的最简单,最通用的方法是在单独的程序中运行每个测试对象。也许有可能玩游戏,比如动态加载和卸载包含该函数的库(每个@VadimKey),但这取决于标准C或C ++之外的功能,并且它使测试环境与大多数不同功能可能会看到的其他环境。
否则,如果多个对象必须在同一个测试程序的同一个运行中运行测试,那么就没有办法让它们拥有函数的私有副本'静态变量。您最好的选择可能只是构建您的测试以适应这种情况。
答案 2 :(得分:0)
如果您可以访问源代码,请以某种方式更改它以使此计数器外部。将其作为参数传递,或者使用计数器作为成员创建一个类。
如果您无法使用此函数更改源代码,则可以使用单独的计数器创建包装类。