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

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



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

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

Код: 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
14.03.2018, 14:55
    #39614788
д0kХ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше сделать: #ifdef
Anatoly MoskovskyРолг ХупинКонстанта определяется в строке компилятора.
Как проверять значение в таком случае?
Код: plaintext
1.
#if defined(DOCALL) && DOCALL > 1



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

Like !




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

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

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

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

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




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



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

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

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

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

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



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

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

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


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

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

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

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



Аналогично и для всех функций которые тебе надо включать или выключать из компиляции.
...
Рейтинг: 0 / 0
14.03.2018, 23:01
    #39615082
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше сделать: #ifdef
Ролг ХупинВ этом *.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
14.03.2018, 23:03
    #39615083
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше сделать: #ifdef
White Owl
Код: plaintext
1.
2.
3.
4.
5.
#define DoCall() { \
   #ifdef DOCALL  \
        real_DoCall() \
   #endif  \
}


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

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

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

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

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




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

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

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

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

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

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

7 Профит .

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

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

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

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

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

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

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

Я не удержушь что бы не забежать в ПТ и трольнуть русский мир интеллектуальной бандровщиной тряхнуть стариной :)
...
Рейтинг: 0 / 0
15.03.2018, 13:44
    #39615360
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше сделать: #ifdef
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
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как лучше сделать: #ifdef / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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