Как узнать внутри функции, что объявлена и существует статическая переменная? (#ifdef, как я понял, ее не увидит)

 

Всех приветствую. 

Такая задача - в классе надо определять, объявлена ли некая переменная (статическая, но не суть), и если она существует - то выполнять некоторые действия, если не существует - то выполнять другие действия.

Хотел сделать так:

   static int iTest = 10;

   #ifdef iTest
      Print("Well...");
   #else 
      Print("Ups!");
   #endif
   

Оказалось, что директива #ifdef не видит объявленных переменных. Код печатает "Ups!", хотя переменная iTest объявлена, и, по идее, должна быть видна директиве.

Какие еще есть варианты? 

 
#define iTest_MACROS

void OnStart()
{
#ifdef iTest_MACROS
  static int iTest = 10;
#endif // #ifdef iTest_MACROS
  
#ifdef iTest_MACROS
  Print("Well...");
#else // #ifdef iTest_MACROS
  Print("Ups!");
#endif // #ifdef iTest_MACROS #else
}
 
Georgiy Merts:

Всех приветствую. 

Такая задача - в классе надо определять, объявлена ли некая переменная (статическая, но не суть), и если она существует - то выполнять некоторые действия, если не существует - то выполнять другие действия.

Хотел сделать так:

Оказалось, что директива #ifdef не видит объявленных переменных. Код печатает "Ups!", хотя переменная iTest объявлена, и, по идее, должна быть видна директиве.

Какие еще есть варианты? 

Нет такой возможности в языке.

А можно узнать, для чего Вам это понадобилось?

 
fxsaber #:

Да, с помощью дополнительного дефайна я и сделал... Но, тогда при каждом объявлении такой переменной надо будет не забывать вставлять такой дефайн.

 
Koldun Zloy #:

Нет такой возможности в языке.

А можно узнать, для чего Вам это понадобилось?

Иногда внутри класса требуются разные действия, в зависимости от того, есть ли определенные внешние input-переменные или нет. 

 
Georgiy Merts #:

Иногда внутри класса требуются разные действия, в зависимости от того, есть ли определенные внешние input-переменные или нет. 

Это было понятно из первого сообщения.

Я правильно понимаю, что Вы пишете библиотеку, которую будете использовать в разных программах?

В этом случае использовать внешние переменные непосредственно внутри класса нежелательно.

Лучше передавать нужные данные в аргументах конструктора.

 
Koldun Zloy #:

Это было понятно из первого сообщения.

Я правильно понимаю, что Вы пишете библиотеку, которую будете использовать в разных программах?

В этом случае использовать внешние переменные непосредственно внутри класса нежелательно.

Лучше передавать нужные данные в аргументах конструктора.

Все верно. Лучше передавать данные. Но, слишком много надо тогда менять.  

В данном случае я пишу код этакой мини-базы данных, которая бы хранила оптимизационные настройки всех ТС Лиги. 

После оптимизации очередной ТС - ее данные записываются в БД.  

Но, необходимо управлять этим процессом - когда данные надо записать, а когда просто сделать тестовый "прогон". Соответственно, я ввел флаг bStore2BD.  

Однако, этот флаг используется только в ТС, работающих в Лиге. Остальные ТС про него не знают, а они у меня имеются. Вот и хорошо бы сделать так, чтобы код менялся только в ТС Лиги, не затрагивая остальных, если такого флага нет. 

Конечно, это "костыль", надо было изначально проектировать всю Лигу так, чтобы все установки всех систем помещались в БД, а не прямо в коде. Ну да может быть, когда-то в будущем все перепишу... 

И... давай на "ты", все-таки мы тут вроде как коллеги...

 
Georgiy Merts #:

Все верно. Лучше передавать данные. Но, слишком много надо тогда менять.  

В данном случае я пишу код этакой мини-базы данных, которая бы хранила оптимизационные настройки всех ТС Лиги. 

После оптимизации очередной ТС - ее данные записываются в БД.  

Но, необходимо управлять этим процессом - когда данные надо записать, а когда просто сделать тестовый "прогон". Соответственно, я ввел флаг bStore2BD.  

Однако, этот флаг используется только в ТС, работающих в Лиге. Остальные ТС про него не знают, а они у меня имеются. Вот и хорошо бы сделать так, чтобы код менялся только в ТС Лиги, не затрагивая остальных, если такого флага нет. 

Конечно, это "костыль", надо было изначально проектировать всю Лигу так, чтобы все установки всех систем помещались в БД, а не прямо в коде. Ну да может быть, когда-то в будущем все перепишу... 

И... давай на "ты", все-таки мы тут вроде как коллеги...

Если остальные ТС про него не знают, то они будут его просто игнорировать. Пока не вижу проблемы.

 
Koldun Zloy #:

Если остальные ТС про него не знают, то они будут его просто игнорировать. Пока не вижу проблемы.

Нееет. 

При записи класс торговой системы записывает свои данные, и вызывает функцию записи предка, чтобы он тоже записал свои внутренние данные, тот - своего предка, и так, до самого базового класса. 

Некоторые данные при записи должны модифицироваться, подменяться (например, момент записи, который в тестере - отличается от локального времени) и модификация происходит только тогда, когда входной флаг записи установлен. Соответственно, о входном флаге должен знать самый базовый класс, и сравнивать его, чтобы понять, нужна ли модификация данных. 

Но для ТС, не входящих в Лигу, флага записи нет, да и функция записи чаще всего не нужна. Но она-то есть, и компилятор ее воспринимает, пишет, что, мол, "необъявленная переменная". 

Вот, пока я решил эту проблему через дополнительный дефайн, примерно так, как предложил fxsaber. Корень проблемы в том, что про запись в БД должен знать самый базовый класс, который используется во всех ТС, а в момент разработки этого класса я не предусматривал функции записи-загрузки в БД. Эта функция была добавлена лишь позже, когда я решил автоматизировать запись настроек оптимизации. В результате базовый класс ТС Лиги знает про запись-чтение, а базовый класс ТС, не входящих в Лигу - про него не знает. Но, дополнительный дефайн - все "разруливает".


Костыль, конечно. "По уму" - надо, конечно, сделать так, как предлагаешь ты. Но пока руки еще не доходят до полной переделки. 

 
Georgiy Merts #:

Нееет. 

При записи класс торговой системы записывает свои данные, и вызывает функцию записи предка, чтобы он тоже записал свои внутренние данные, тот - своего предка, и так, до самого базового класса. 

Некоторые данные при записи должны модифицироваться, подменяться (например, момент записи, который в тестере - отличается от локального времени) и модификация происходит только тогда, когда входной флаг записи установлен. Соответственно, о входном флаге должен знать самый базовый класс, и сравнивать его, чтобы понять, нужна ли модификация данных. 

Но для ТС, не входящих в Лигу, флага записи нет, да и функция записи чаще всего не нужна. Но она-то есть, и компилятор ее воспринимает, пишет, что, мол, "необъявленная переменная". 

Вот, пока я решил эту проблему через дополнительный дефайн, примерно так, как предложил fxsaber. Корень проблемы в том, что про запись в БД должен знать самый базовый класс, который используется во всех ТС, а в момент разработки этого класса я не предусматривал функции записи-загрузки в БД. Эта функция была добавлена лишь позже, когда я решил автоматизировать запись настроек оптимизации. В результате базовый класс ТС Лиги знает про запись-чтение, а базовый класс ТС, не входящих в Лигу - про него не знает. Но, дополнительный дефайн - все "разруливает".


Костыль, конечно. "По уму" - надо, конечно, сделать так, как предлагаешь ты. Но пока руки еще не доходят до полной переделки. 

Я конечно плохо представляю всю архитектуру, но мне кажется, что внести изменения в базовый класс не так сложно.

Это ведь твой собственный класс, и изменения не такие большие.

 
Koldun Zloy #:

Я конечно плохо представляю всю архитектуру, но мне кажется, что внести изменения в базовый класс не так сложно.

Это ведь твой собственный класс, и изменения не такие большие.

Ну так я и меняю его. Но, просто его используют практически все ТС в моем "хозяйстве".  И далеко не все "знают" про возможность записи. 

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

А вот когда флаг есть - то при компиляции "не знающего" эксперта - тут же компилятор возмущается, что используется необъявленная переменная. 

Всё. Решил с помощью дополнительного дефайна. Наш повелитель дефайнов fxsaber совершенно прав. Это наиболее простое и надежное решение. А если дойдет до радикальной переработки всего кода - тогда и проблема отпадет, и твое предложение будет очень даже в тему.