Как узнать внутри функции, что объявлена и существует статическая переменная? (#ifdef, как я понял, ее не увидит)
#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 }
Всех приветствую.
Такая задача - в классе надо определять, объявлена ли некая переменная (статическая, но не суть), и если она существует - то выполнять некоторые действия, если не существует - то выполнять другие действия.
Хотел сделать так:
Оказалось, что директива #ifdef не видит объявленных переменных. Код печатает "Ups!", хотя переменная iTest объявлена, и, по идее, должна быть видна директиве.
Какие еще есть варианты?
Нет такой возможности в языке.
А можно узнать, для чего Вам это понадобилось?
Иногда внутри класса требуются разные действия, в зависимости от того, есть ли определенные внешние input-переменные или нет.
Это было понятно из первого сообщения.
Я правильно понимаю, что Вы пишете библиотеку, которую будете использовать в разных программах?
В этом случае использовать внешние переменные непосредственно внутри класса нежелательно.
Лучше передавать нужные данные в аргументах конструктора.
Это было понятно из первого сообщения.
Я правильно понимаю, что Вы пишете библиотеку, которую будете использовать в разных программах?
В этом случае использовать внешние переменные непосредственно внутри класса нежелательно.
Лучше передавать нужные данные в аргументах конструктора.
Все верно. Лучше передавать данные. Но, слишком много надо тогда менять.
В данном случае я пишу код этакой мини-базы данных, которая бы хранила оптимизационные настройки всех ТС Лиги.
После оптимизации очередной ТС - ее данные записываются в БД.
Но, необходимо управлять этим процессом - когда данные надо записать, а когда просто сделать тестовый "прогон". Соответственно, я ввел флаг bStore2BD.
Однако, этот флаг используется только в ТС, работающих в Лиге. Остальные ТС про него не знают, а они у меня имеются. Вот и хорошо бы сделать так, чтобы код менялся только в ТС Лиги, не затрагивая остальных, если такого флага нет.
Конечно, это "костыль", надо было изначально проектировать всю Лигу так, чтобы все установки всех систем помещались в БД, а не прямо в коде. Ну да может быть, когда-то в будущем все перепишу...
И... давай на "ты", все-таки мы тут вроде как коллеги...
Все верно. Лучше передавать данные. Но, слишком много надо тогда менять.
В данном случае я пишу код этакой мини-базы данных, которая бы хранила оптимизационные настройки всех ТС Лиги.
После оптимизации очередной ТС - ее данные записываются в БД.
Но, необходимо управлять этим процессом - когда данные надо записать, а когда просто сделать тестовый "прогон". Соответственно, я ввел флаг bStore2BD.
Однако, этот флаг используется только в ТС, работающих в Лиге. Остальные ТС про него не знают, а они у меня имеются. Вот и хорошо бы сделать так, чтобы код менялся только в ТС Лиги, не затрагивая остальных, если такого флага нет.
Конечно, это "костыль", надо было изначально проектировать всю Лигу так, чтобы все установки всех систем помещались в БД, а не прямо в коде. Ну да может быть, когда-то в будущем все перепишу...
И... давай на "ты", все-таки мы тут вроде как коллеги...
Если остальные ТС про него не знают, то они будут его просто игнорировать. Пока не вижу проблемы.
Если остальные ТС про него не знают, то они будут его просто игнорировать. Пока не вижу проблемы.
Нееет.
При записи класс торговой системы записывает свои данные, и вызывает функцию записи предка, чтобы он тоже записал свои внутренние данные, тот - своего предка, и так, до самого базового класса.
Некоторые данные при записи должны модифицироваться, подменяться (например, момент записи, который в тестере - отличается от локального времени) и модификация происходит только тогда, когда входной флаг записи установлен. Соответственно, о входном флаге должен знать самый базовый класс, и сравнивать его, чтобы понять, нужна ли модификация данных.
Но для ТС, не входящих в Лигу, флага записи нет, да и функция записи чаще всего не нужна. Но она-то есть, и компилятор ее воспринимает, пишет, что, мол, "необъявленная переменная".
Вот, пока я решил эту проблему через дополнительный дефайн, примерно так, как предложил fxsaber. Корень проблемы в том, что про запись в БД должен знать самый базовый класс, который используется во всех ТС, а в момент разработки этого класса я не предусматривал функции записи-загрузки в БД. Эта функция была добавлена лишь позже, когда я решил автоматизировать запись настроек оптимизации. В результате базовый класс ТС Лиги знает про запись-чтение, а базовый класс ТС, не входящих в Лигу - про него не знает. Но, дополнительный дефайн - все "разруливает".
Костыль, конечно. "По уму" - надо, конечно, сделать так, как предлагаешь ты. Но пока руки еще не доходят до полной переделки.
Нееет.
При записи класс торговой системы записывает свои данные, и вызывает функцию записи предка, чтобы он тоже записал свои внутренние данные, тот - своего предка, и так, до самого базового класса.
Некоторые данные при записи должны модифицироваться, подменяться (например, момент записи, который в тестере - отличается от локального времени) и модификация происходит только тогда, когда входной флаг записи установлен. Соответственно, о входном флаге должен знать самый базовый класс, и сравнивать его, чтобы понять, нужна ли модификация данных.
Но для ТС, не входящих в Лигу, флага записи нет, да и функция записи чаще всего не нужна. Но она-то есть, и компилятор ее воспринимает, пишет, что, мол, "необъявленная переменная".
Вот, пока я решил эту проблему через дополнительный дефайн, примерно так, как предложил fxsaber. Корень проблемы в том, что про запись в БД должен знать самый базовый класс, который используется во всех ТС, а в момент разработки этого класса я не предусматривал функции записи-загрузки в БД. Эта функция была добавлена лишь позже, когда я решил автоматизировать запись настроек оптимизации. В результате базовый класс ТС Лиги знает про запись-чтение, а базовый класс ТС, не входящих в Лигу - про него не знает. Но, дополнительный дефайн - все "разруливает".
Костыль, конечно. "По уму" - надо, конечно, сделать так, как предлагаешь ты. Но пока руки еще не доходят до полной переделки.
Я конечно плохо представляю всю архитектуру, но мне кажется, что внести изменения в базовый класс не так сложно.
Это ведь твой собственный класс, и изменения не такие большие.
Я конечно плохо представляю всю архитектуру, но мне кажется, что внести изменения в базовый класс не так сложно.
Это ведь твой собственный класс, и изменения не такие большие.
Ну так я и меняю его. Но, просто его используют практически все ТС в моем "хозяйстве". И далеко не все "знают" про возможность записи.
При отсутствии флага записи - никаких проблем, функция просо не вызывается, и не важно, что класс "не знает" про запись.
А вот когда флаг есть - то при компиляции "не знающего" эксперта - тут же компилятор возмущается, что используется необъявленная переменная.
Всё. Решил с помощью дополнительного дефайна. Наш повелитель дефайнов fxsaber совершенно прав. Это наиболее простое и надежное решение. А если дойдет до радикальной переработки всего кода - тогда и проблема отпадет, и твое предложение будет очень даже в тему.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всех приветствую.
Такая задача - в классе надо определять, объявлена ли некая переменная (статическая, но не суть), и если она существует - то выполнять некоторые действия, если не существует - то выполнять другие действия.
Хотел сделать так:
Оказалось, что директива #ifdef не видит объявленных переменных. Код печатает "Ups!", хотя переменная iTest объявлена, и, по идее, должна быть видна директиве.
Какие еще есть варианты?