powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как лучше сделать: #ifdef
25 сообщений из 33, страница 1 из 2
Как лучше сделать: #ifdef
    #39614591
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть класс, в нем делаются вызовы функции

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
...
#ifdef DOCALL
DoCall();
#endif

#ifdef DOCALL
DoCall();
#endif

#ifdef DOCALL
DoCall();
#endif

#ifdef DOCALL
DoCall();
#endif
...



Надо часть вызовов заменить на DoCall2() типа такого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
...
#ifdef DOCALL
DoCall();
#endif

#ifdef DOCALL
    #ifdef DOCALL2
      DoCall2();
    #endif
#endif

#ifdef DOCALL
DoCall();
#endif

#ifdef DOCALL
    #ifdef DOCALL2
      DoCall2();
    #endif
#endif
...



Хотел использовать вторую константу, но подумал, что можно эту же, но со значением.
Константа определяется в строке компилятора.
Как проверять значение в таком случае?
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39614690
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Положи макросы не снаружи а внутри docall.
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39614703
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинКонстанта определяется в строке компилятора.
Как проверять значение в таком случае?
Код: plaintext
1.
#if defined(DOCALL) && DOCALL > 1



Но вообще у вас неправильное использование условной компиляции.
Надо ветки делать в одном месте в вызываемом коде, а не во множестве мест в вызывающем.
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39614730
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинЕсть класс, в нем делаются вызовы функции

Что, опять поделка студентов из Беркли?..

Код: sql
1.
2.
3.
4.
5.
#if defined DOCALL && defined DOCALL2
#define DoCall2 RealDoCall2
#else
#define DoCall2 stub
#endif


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39614788
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyРолг ХупинКонстанта определяется в строке компилятора.
Как проверять значение в таком случае?
Код: plaintext
1.
#if defined(DOCALL) && DOCALL > 1



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

Like !




5 копеек к лайку
Вобще то, ИМХО, сие лучше решать через полиморфизм ( виртуальные функции классов)
или шаблонны если типы параметров принципиально отличаются.

DOCALL-ы обязательно где то отличаются,
инфа сотка :)
типами, количеством параметров.......

...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39614832
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovРолг ХупинЕсть класс, в нем делаются вызовы функции

Что, опять поделка студентов из Беркли?..

Код: sql
1.
2.
3.
4.
5.
#if defined DOCALL && defined DOCALL2
#define DoCall2 RealDoCall2
#else
#define DoCall2 stub
#endif




в общем - да, но это моё более глубокое погружение, глаза б мои их не видели (ц)
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39614839
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyРолг ХупинКонстанта определяется в строке компилятора.
Как проверять значение в таком случае?
Код: plaintext
1.
#if defined(DOCALL) && DOCALL > 1



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

теоретически - да, согласен, но наверное не всегда это верно:

если сделать внутри функции, то она будет вызываться в любом случае, а это производительность.
если, например, эта функция пишет данные в лог, и я не хочу, чтобы она писала на каких-то операциях, а на других писала - как тут внутрь всунуть? внутри код один и тот же и он не знает, откуда его вызвали, а вот вызовы стоят в разных местах, включая те, в которых я хочу ограничить.
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39614867
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупинесли сделать внутри функции, то она будет вызываться в любом случае, а это производительность.
Зачем внутри? Сделайте снаружи, вокруг объявления функции (в ее хедер файле).
Там выше Dimitry Sibiryakov привел пример как это делать.
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615051
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyРолг Хупинесли сделать внутри функции, то она будет вызываться в любом случае, а это производительность.
Зачем внутри? Сделайте снаружи, вокруг объявления функции (в ее хедер файле).
Там выше Dimitry Sibiryakov привел пример как это делать.

В этом *.c файле она не будет вызываться, т.е. вместо нее будет заглушка, а в других будет?
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615070
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинAnatoly Moskovskyпропущено...

Код: plaintext
1.
#if defined(DOCALL) && DOCALL > 1



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

теоретически - да, согласен, но наверное не всегда это верно:

если сделать внутри функции, то она будет вызываться в любом случае, а это производительность.
если, например, эта функция пишет данные в лог, и я не хочу, чтобы она писала на каких-то операциях, а на других писала - как тут внутрь всунуть? внутри код один и тот же и он не знает, откуда его вызвали, а вот вызовы стоят в разных местах, включая те, в которых я хочу ограничить.
Если тело функции будет пустое то хороший оптимизирующий компиллятор его выкинет
и проблемы производительности не будет. Более того. Если речь идет о логгировании
(а ты должен понимать что это I/O) то цена дисковой операции в 10-100-1000 крат превышает
цену проверки условия. И даже если ты не будешь использовать макро-процессор
а просто поставишь банальный if (level > currentLevel) то такой функционал будет
лучше и гибче чем эти страшные многоэтажные препроцессинги которые ты безосновательно
затолкал в код в надежде решить проблемы перформанса. Дружище - не там ищешь.
Не там, родной. Забудь про препроцессор. Он для других дел создавался.
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615075
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonРолг Хупинпропущено...


теоретически - да, согласен, но наверное не всегда это верно:

если сделать внутри функции, то она будет вызываться в любом случае, а это производительность.
если, например, эта функция пишет данные в лог, и я не хочу, чтобы она писала на каких-то операциях, а на других писала - как тут внутрь всунуть? внутри код один и тот же и он не знает, откуда его вызвали, а вот вызовы стоят в разных местах, включая те, в которых я хочу ограничить.
Если тело функции будет пустое то хороший оптимизирующий компиллятор его выкинет
и проблемы производительности не будет. Более того. Если речь идет о логгировании
(а ты должен понимать что это I/O) то цена дисковой операции в 10-100-1000 крат превышает
цену проверки условия. И даже если ты не будешь использовать макро-процессор
а просто поставишь банальный if (level > currentLevel) то такой функционал будет
лучше и гибче чем эти страшные многоэтажные препроцессинги которые ты безосновательно
затолкал в код в надежде решить проблемы перформанса. Дружище - не там ищешь.
Не там, родной. Забудь про препроцессор. Он для других дел создавался.

Откуда возьмётся пустое тело функции?
Если я определю дефайном в одном файле, то это определение сработает и для других?
Мне надо вызывать в одном классе лог только если сильно надо, а в других - всегда.
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615081
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

Тогда тебе надо спрятать функцию DoCall() (например в real_DoCall ) и сделать макрос типа:
Код: plaintext
1.
2.
3.
4.
5.
#define DoCall() { \
   #ifdef DOCALL  \
        real_DoCall() \
   #endif  \
}



Аналогично и для всех функций которые тебе надо включать или выключать из компиляции.
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615082
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинВ этом *.c файле она не будет вызываться, т.е. вместо нее будет заглушка, а в других будет?
Зачем заглушка. Можно вообще ничего не подставлять.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
// fun.h
#if defined(DOCALL)
#define DoCall(...) RealDoCall(__VA_ARGS__)
#else
#define DoCall(...) 
#endif

#if defined(DOCALL) && DOCALL > 1
#define DoCall2(...) RealDoCall2(__VA_ARGS__)
#else
#define DoCall2(...) 
#endif

// user.c
#include "fun.h"
...

DoCall(1,2,3);
DoCall2(1,2,3);
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615083
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Код: plaintext
1.
2.
3.
4.
5.
#define DoCall() { \
   #ifdef DOCALL  \
        real_DoCall() \
   #endif  \
}


#if внутри #define не работает.
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615084
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинОткуда возьмётся пустое тело функции?
Если я определю дефайном в одном файле, то это определение сработает и для других?
Мне надо вызывать в одном классе лог только если сильно надо, а в других - всегда.
Стоп-стоп. Вот с этого момента - какая-то каша. Под функцией я имел в виду твой метод
DoCall(). Это первое. И второе. Ты спрашиваешь - "определю дефайном в одном файле,
то это определение сработает и для других". Ты быстрее это проверишь сам. Дольше
я буду уточнять где у тебя файл и где определение и какова область видимости.

Но я даю почву для расмышлений. Только мне сложно рассуждать не видя твой исходник
целиком. Надеюсь ты это понимашь и не будешь требовать от меня телепатии.

Будь так любезен.
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615104
д0кХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупинmaytonпропущено...

Если тело функции будет пустое то хороший оптимизирующий компиллятор его выкинет
и проблемы производительности не будет. Более того. Если речь идет о логгировании
(а ты должен понимать что это I/O) то цена дисковой операции в 10-100-1000 крат превышает
цену проверки условия. И даже если ты не будешь использовать макро-процессор
а просто поставишь банальный if (level > currentLevel) то такой функционал будет
лучше и гибче чем эти страшные многоэтажные препроцессинги которые ты безосновательно
затолкал в код в надежде решить проблемы перформанса. Дружище - не там ищешь.
Не там, родной. Забудь про препроцессор. Он для других дел создавался.

Откуда возьмётся пустое тело функции?
Если я определю дефайном в одном файле, то это определение сработает и для других?
Мне надо вызывать в одном классе лог только если сильно надо, а в других - всегда.




1 пишешь макрос TRACE(.....) в отдельной единице компляции .

2 Если переменная TRACE_ON. взведена , макос вставляет в код
функцию трассировки.

3 Если не взведена макрос ничего не делает в коде не будет вызова функции трассировки.

4 инклюдишь файл с трассирочным макросом в свои исходники.

5 там дефайнишь TRACE_ON при необходимости

6 делаешь вызов TRACE(.....) хоть в каждой второй строке.

7 Профит .

Приблизительно так .....
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615113
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет док. По прежнему - инкогнито?
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615114
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зарегистрированным доступен "Просто трёп". Наверное, есть чего опасаться
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615116
д0кХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonПривет док. По прежнему - инкогнито?
Та вроде все знают, что я Дохтар на ПСЖ :)

передай там по случаю привет Софтвареру в ЗПТ.
Деду и Тафи в ПТ :)
И папке акузу в арею :)
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615117
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не хожу в ЗПТ. Принципиально. Я - завсегда с народом.
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615121
д0кХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonЯ не хожу в ЗПТ. Принципиально. Я - завсегда с народом.

Я говрил по случаю, если вдруг ....

Я хожу только оракл, программирование и сюда.

И очень редко .
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615133
д0кХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonПривет док. По прежнему - инкогнито?

Смысла не вижу, меня через пару часов всревно забанят за хохлосрач :)
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615134
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так ты надень второе лицо. Для С++. :)
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615138
д0кХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonТак ты надень второе лицо. Для С++. :)

Я свои колоритные трусы не меняю :)

Я не удержушь что бы не забежать в ПТ и трольнуть русский мир интеллектуальной бандровщиной тряхнуть стариной :)
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615360
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyРолг ХупинВ этом *.c файле она не будет вызываться, т.е. вместо нее будет заглушка, а в других будет?
Зачем заглушка. Можно вообще ничего не подставлять.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
// fun.h
#if defined(DOCALL)
#define DoCall(...) RealDoCall(__VA_ARGS__)
#else
#define DoCall(...) 
#endif

#if defined(DOCALL) && DOCALL > 1
#define DoCall2(...) RealDoCall2(__VA_ARGS__)
#else
#define DoCall2(...) 
#endif

// user.c
#include "fun.h"
...

DoCall(1,2,3);
DoCall2(1,2,3);



С user.c - ясно, переопределены и будут вызваны или не вызваны.

Так будет во всех *.c функциях, включающих
#include "fun.h"

Что будет на месте этих функций в третьем файле
user3.c, который не включает #include "fun.h"?
Останутся как были?
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как лучше сделать: #ifdef
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]