Как ограничить доступ к статическим переменным в C++?
У меня есть C-функция с именем "count", которая выглядит так:
void count(){
static int c = 0;
printf("Counter=%i", c);
c++;
}
Кроме того, у меня есть вектор Cpp-объектов, и каждый объект вызывает функцию "count". Поскольку переменная counter является статической, вызов, сделанный одним объектом, также увеличит значение счетчика для всех других объектов. Что мне действительно нужно, так это выделенный счетчик для каждого объекта, учитывая ограничение на то, что функция "count" является Device-Under-Test и не может быть изменена. Я думаю, что это должно быть возможно с использованием пространств имен... Есть идеи?
Моя первоначальная идея состояла в том, чтобы использовать пространства имен...
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 ответа
Проблема, как спрашивается, не может быть решена. Если функция не может быть изменена, то ничего нельзя сделать, чтобы начать подсчет отдельных экземпляров.
Переменные с static
Класс хранения, такой как в вашем примере, является глобальным в том смысле, что в программе есть только одна копия. Это не зависит от их связи, которая определяет, откуда на них можно ссылаться. Независимо от класса хранения, локальные переменные функций не имеют связи, то есть к ним можно получить прямой доступ только из тела функции.
Если вы не можете изменить функцию, то нет способа сделать ее переменной c
доступный в другом месте (например, путем выставления указателя на него), поэтому у тестовых подпрограмм нет альтернативы, скажем, для сброса его значения между тестами или его считывания. Следовательно, если разные тестовые объекты должны иметь свои собственные копии этой конкретной переменной, из этого следует, что они должны иметь свою собственную копию функции, которая ее содержит.
Самый простой и общий способ добиться этого - запустить каждый тестовый объект в отдельной программе. Также возможно играть в такие игры, как динамическая загрузка и выгрузка библиотеки, содержащей эту функцию (для @VadimKey), но это зависит от функций, не относящихся к стандарту C или C++, и это делает среду тестирования довольно отличной от большинства в других средах функция, вероятно, увидит.
В противном случае, если несколько объектов должны запускать тесты в рамках одного и того же прогона одной и той же тестовой программы, то нет никакого способа заставить их иметь частные копии статических переменных функций. Лучше всего просто структурировать свои тесты, чтобы учесть это.
Если вы можете получить доступ к исходному коду, измените его каким-либо образом, чтобы сделать этот счетчик внешним. Либо передайте его в качестве параметра, либо создайте класс со счетчиком в качестве члена.
Если вы не можете изменить исходный код с помощью этой функции, тогда вы можете создать класс-оболочку с отдельным счетчиком.