2016-05-26 6 views
0

У меня есть C-функция под названием «счетчик», который выглядит следующим образом:Как ограничить доступ к статическим переменным в C++?

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

Futhermore У меня есть вектор CPP-объекты и каждый объект вызывает функцию «счетчик». Поскольку переменная счетчика является статической, вызов, сделанный одним объектом, будет увеличивать значение счетчика для всех других объектов. То, что я на самом деле хочу, это выделенный счетчик для каждого объекта, учитывая ограничение, что функция «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-объекта, как это ...

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

Это не работает для меня. Любая идея почему?

+3

Так что вы говорите, что представленный код не может быть изменен? Не имеет смысла. Он будет увеличиваться каждый раз при вызове. Период. –

+6

Если вы хотите, чтобы выделенный счетчик для каждого объекта добавлял этот счетчик в качестве члена класса. –

+3

Кроме того, переменные, объявленные внутри функции, не имеют привязки, поэтому вы не можете обращаться к ним напрямую из любой точки вне их функции объявления. Это предотвращает, скажем, сброс тестового кода переменной между тестами. –

ответ

0

Если вы можете получить доступ к исходному коду, измените его каким-либо образом, чтобы сделать этот счетчик внешним. Либо передайте его как параметр, либо создайте класс со счетчиком в качестве члена.

Если вы не можете изменить исходный код с помощью этой функции, вы можете создать класс-оболочку с отдельным счетчиком.

+2

OP замечает, что «функция« count »является Device-Under-Test и не может быть изменена». –

+1

@JohnBollinger, то там только один простое решение запускает каждый тест как отдельный процесс. Или, сделайте общую библиотеку и загрузите/разгрузите ее каждый раз ... –

1

Проблема не может быть решена. Если функция немодифицируется, нет ничего, что можно было бы сделать, чтобы начать подсчет отдельных экземпляров.

1

Переменные с staticКласс хранения, например, один в вашем примере, является глобальным в том смысле, что в программе есть только одна копия. Это не зависит от их связи , которая определяет, от какого места они могут ссылаться. Независимо от их класса хранения, локальные переменные функций не имеют никакой связи, что означает, что к ним можно напрямую обращаться только изнутри тела функции.

Если вы не можете изменить функцию, тогда нет возможности сделать переменную c доступной в другом месте (например, путем отображения указателя на нее), поэтому нет альтернативы для тестовых процедур, скажем, для ее сброса значение между тестами или прочитать его. Поэтому, если разные тестовые объекты должны иметь свои собственные копии этой конкретной переменной, то из этого следует, что у них должна быть своя копия функции, которая ее содержит.

Самый простой и общий способ добиться этого - запустить каждый тестовый объект в отдельной программе. Также возможно играть в игры, такие как динамическая загрузка и выгрузка библиотеки, содержащей эту функцию (за @VadimKey), но это зависит от возможностей, отличных от функций стандарта C или C++, и делает тестовую среду весьма отличной от большинства другие среды, которые функция, вероятно, увидит.

В противном случае, если несколько объектов должны запускать тесты в рамках одного и того же прогона одной и той же тестовой программы, тогда нет способа заставить их иметь частные копии статических переменных функций. Ваш лучший выбор может состоять в том, чтобы структурировать ваши тесты для их соответствия.