powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как лучше сделать: #ifdef
33 сообщений из 33, показаны все 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
Как лучше сделать: #ifdef
    #39615428
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинЧто будет на месте этих функций в третьем файле
user3.c, который не включает #include "fun.h"?
Останутся как были?
Что значит не включает? Чтобы вызвать функцию, нужно иметь ее прототип.
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615435
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин

Что будет на месте этих функций в третьем файле
user3.c, который не включает #include "fun.h"?
Останутся как были?

Ошибка компиляции.
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615491
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересный эффект
сделал такой тест


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
#include "stdafx.h"
#include "TestClass1.h"

#ifndef DoLog
	#define DoLog(...) DoDoLog(__VA_ARGS__)
#endif

#define DOCALL 2

#if defined(DOCALL) && DOCALL > 1
	#define DoLog2(...) DoDoLog2(__VA_ARGS__)
#else
	#define DoLog2(...) 
#endif

void DoDoLog(char* s, int level, int flags);
void DoDoLog2(char* s, int level, int flags);

int main()
{
	DoLog("main: started", 0, 11);
	TestClass1* t = new TestClass1();
	if (t)
	{
		DoLog2("main: TestClass1 created", 1, 101);
		t->RunTest();
	}
	else
	{
		DoLog2("main: TestClass1 NOT created", 2, 201);
	}

	printf("Enter any key...");
	DoLog("main: Exit", 0, 101);
	getchar();
    return 0;
}

void DoDoLog(char* s, int level, int flags)
{
	Logger *log = new Logger();
	log->DoLog(s, level);
}
void DoDoLog2(char* s, int level, int flags)
{
	Logger *log = new Logger();
	char msgstr[1024];
	sprintf(msgstr,"DoDoLog2: %s",s);
	log->DoLog(msgstr, level);
}


///...

#include "stdafx.h"
#include "Logger.h"


Logger::Logger()
{
}


Logger::~Logger()
{
}

void Logger::DoLog(char* msg, int nLevel)
{
	printf("DoLog(%d): %s\n", nLevel, msg);
}




пишет ошибку, т.е. в лоб заменяет:

Код: plaintext
1.
2.
Severity	Code	Description	Project	File	Line	Suppression State
Error	C2039	'DoDoLog': is not a member of 'Logger'	TestConApp1	d:\_samples\pg\testconapp1\testconapp1\testconapp1.cpp	
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615497
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупинв лоб заменяет:
Это же макросы. Они не понимают С/С++ - они работают просто с лексемами.
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615607
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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);



По поводу ничего не подставлять, что будет если вот так и без заглушки?

Код: plaintext
1.
2.
3.
4.
5.
printf("Begin");
for(int i=0; i<N; i++)
   DoCall2(s, 5, 105);// <-----------

printf("End");
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615617
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупинчто будет если вот так и без заглушки?

Попробуй и узнаешь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615618
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинПо поводу ничего не подставлять, что будет если вот так и без заглушки?

Код: plaintext
1.
2.
3.
4.
5.
printf("Begin");
for(int i=0; i<N; i++)
   DoCall2(s, 5, 105);// <-----------

printf("End");


Будет

Код: plaintext
1.
2.
3.
4.
printf("Begin");
for(int i=0; i<N; i++)
   ;// <-----------
printf("End");


... что и требовалось.
";" - это валидный пустой оператор в С/С++
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615757
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
Хотел использовать вторую константу, но подумал, что можно эту же, но со значением.
Константа определяется в строке компилятора.
Как проверять значение в таком случае?


Код: plaintext
1.
2.
3.
#if DOCALL == 1
#elif DOCALL == 2
#endif



http://en.cppreference.com/w/cpp/preprocessor/conditional
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как лучше сделать: #ifdef
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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