Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите победить препроцессор (не всё заменяет) / 25 сообщений из 26, страница 1 из 2
23.10.2013, 08:58
    #38437837
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
MS VC 6.
Отладочных вставок достаточно много. Для уменьшения писанины типа #if defined(_DEBUG) ... #endif решил немного соптимизировать препроцессором.
В начале кода есть такие строчки:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#if defined(_DEBUG)
	#define DEBUG_printf printf
	#define DEBUGLINE
#else
	#define DEBUG_printf //
	#define DEBUGLINE //
#endif


т.е. закоментировать отладочные вызовы при сборке релиза.

Далее в коде так:
Код: plaintext
1.
2.
DEBUG_printf("123\n");
DEBUGLINE printf("456\n");


В релизе первая строка исчезает, а вторая остается, т.е. 456 выводится.
Можно это как-то победить?

ЗЫ В принципе и первый вариант устраивает, но второй универсальнее.
...
Рейтинг: 0 / 0
23.10.2013, 09:45
    #38437887
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
Dima T,

Закомментировать препроцессором ничего невозможно.
Комментарии "удаляются" ещё до препроцессора.

Вместо этого нужно определять макросы так, чтобы они регулировании пустой, ничего не делающий код.
...
Рейтинг: 0 / 0
23.10.2013, 09:48
    #38437890
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
Dima T,

#define DEBUG_printf //

Эквивалентно

#define DEBUG_printf

Т.е. объявлению макроса как пустого.

Так у тебя не получился.
...
Рейтинг: 0 / 0
23.10.2013, 12:27
    #38438152
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
MasterZivDima T,

#define DEBUG_printf //

Эквивалентно

#define DEBUG_printf

Т.е. объявлению макроса как пустого.

Так у тебя не получился.
Точно. Не подумал что компилятор вместо
Код: plaintext
1.
printf("var=%d\n", iVar);


смог откомпилировать
Код: plaintext
1.
("var=%d\n", iVar);


странно что ни ошибок, ни глюков в работе.

Т.е. получается #if defined(_DEBUG) ... #endif и никаких других вариантов?
...
Рейтинг: 0 / 0
23.10.2013, 12:30
    #38438161
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
Dima T[/src]
смог откомпилировать
Код: plaintext
1.
("var=%d\n", iVar);


странно что ни ошибок, ни глюков в работе.

Т.е. получается #if defined(_DEBUG) ... #endif и никаких других вариантов?


Что странного ?
Это
Код: plaintext
1.
("var=%d\n", iVar);


вполне валидное выражение.
Значение его -- iVar.
...
Рейтинг: 0 / 0
23.10.2013, 12:32
    #38438167
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
Dima T,

Т.е. получается #if defined(_DEBUG) ... #endif и никаких других вариантов?

В общем, да.

Но ты можешь объявить макрос-функцию, и переопределять её либо в реальную функцию, либо в нично.
Но в данном конкретном случае функция-макрос должна иметь переменное кол-во параметров.
Это возможно только в современных С и С++, по последним стандартам. VC6 к этому не относится.
Он уже очень старый.
...
Рейтинг: 0 / 0
23.10.2013, 13:22
    #38438255
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
MasterZivвполне валидное выражение.
Значение его -- iVar.
Буду знать. Только так и не понял зачем такое писать надо бывает. Глубокими познаниями в Си не обладаю, значит это мне знать пока не требуется.
MasterZivНо в данном конкретном случае функция-макрос должна иметь переменное кол-во параметров.
Это возможно только в современных С и С++, по последним стандартам. VC6 к этому не относится.
Он уже очень старый.
Наверно пора задумываться о чем-нибудь посвежее.

На Си немного пишу. В основном DLL-обертки для WinAPI, т.к. в фокспро есть проблемы при работе со структурами, а callback функции вообще невозможно сделать. Тут VC6 хватает, да и привык я к нему.

VC6 нужен чтобы со старым рантаймом Сишным работал. Который во всех виндовсах есть. Что всегда нравилось в VC6 - делай Win32 проект, компилируй и запускай хоть на Win98 - работает и никаких доп. DLL поискать не просит.

С более поздними MSVC в итоге получается моя DLL-ка 30-40 Кб и рантайм в нагрузку 1,5 Мб (msvcp100.dll msvcr100.dll) которого кстати почему-то нет даже в Win7. Хотя по сегодняшним меркам лишние 1,5 Мб можно и проигнорировать. Но боюсь что вдруг на каком-нибудь Win2000 (редко но еще бывает) еще чего-нибудь попросит. Еще линукс с вайном есть у некоторых.
...
Рейтинг: 0 / 0
23.10.2013, 14:26
    #38438364
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
Dima T,

там где нет поддержки макросов с "..." можно сделать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#if defined(_DEBUG)
	#define DEBUG_printf printf
	#define DEBUGLINE
#else
	#define DEBUG_printf if (false) printf
	#define DEBUGLINE if (false)
#endif


Тогда строки
Код: plaintext
1.
2.
DEBUG_printf("123\n");
DEBUGLINE printf("456\n");


В release дают
Код: plaintext
1.
2.
if (false) printf("123\n");
if (false) printf("456\n");


А в debug
Код: plaintext
1.
2.
printf("123\n");
printf("456\n");


if (false) в большинстве компиляторов будет вычислено уже на этапе компиляции и соответствующий код вообще не попадет в программу.
...
Рейтинг: 0 / 0
23.10.2013, 14:29
    #38438367
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
Выше приведенный код с if (false) имеет недостаток -
следующий код не будет работать как ожидается:
Код: plaintext
1.
2.
3.
4.
if (xxxx)
  DEBUG_printf("123\n");
else
  do_somethisng();



else тут будет относиться к if (false)внутри макроса и do_somethisng() будет вызываться в release всегда.

Но к счастью отладочные сообщения обычно печатают без условий :)
...
Рейтинг: 0 / 0
23.10.2013, 15:38
    #38438520
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
Anatoly MoskovskyВыше приведенный код с if (false) имеет недостаток ...
Спасибо за идею. Подходит.
Немного подправлю: чтоб в релизе сюрпризы не получить лучше так написать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#if defined(_DEBUG)
	#define DEBUG_printf if (true) printf
	#define DEBUGLINE if (true) 
#else
	#define DEBUG_printf if (false) printf
	#define DEBUGLINE if (false)
#endif


тогда этот недостаток вскроется еще при дебаге
...
Рейтинг: 0 / 0
23.10.2013, 16:17
    #38438600
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
Dima TНаверно пора задумываться о чем-нибудь посвежее.

vc Express вот только что 2013 вышел..
...
Рейтинг: 0 / 0
23.10.2013, 16:20
    #38438605
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
Dima T,

Ой, лучше уж написать лишний #ifdef _DEBUG ...
...
Рейтинг: 0 / 0
23.10.2013, 16:33
    #38438628
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
MasterZivDima T,

Ой, лучше уж написать лишний #ifdef _DEBUG ...
Еще какие-то подводные камни есть кроме съезжания else?

С else я уже попадал как-то. Долго искал косяк в такой конструкции:
Код: plaintext
1.
2.
3.
4.
if(xxx)
   if(yyy) do_my_func();
else
  ...


после того как нашел никогда так не пишу. даже если одна строчка кода - все-равно в {}.
...
Рейтинг: 0 / 0
23.10.2013, 16:51
    #38438675
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
MasterZivDima TНаверно пора задумываться о чем-нибудь посвежее.

vc Express вот только что 2013 вышел..
так в Express только .NET вроде. Или Win32 проекты тоже можно делать?
...
Рейтинг: 0 / 0
23.10.2013, 18:28
    #38438844
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
Dima TС else я уже попадал как-то. Долго искал косяк в такой конструкции:


Наверное поэтому используют в таких случаях не if, а while(0)
...
Рейтинг: 0 / 0
23.10.2013, 18:30
    #38438847
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
Dima TMasterZivпропущено...


vc Express вот только что 2013 вышел..
так в Express только .NET вроде. Или Win32 проекты тоже можно делать?

На сколько я помно,
C++, С#, F#, VB.net .

К С++ не идёт ничего из дополнительных библиотек, кроме WinSDK.
(MFC нет, ATL нет).
...
Рейтинг: 0 / 0
23.10.2013, 18:31
    #38438849
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
MasterZiv,

А, ещё там лицензия типа "только в ознакомительных целях", не знаю, как на это реагировать...
...
Рейтинг: 0 / 0
23.10.2013, 18:53
    #38438888
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
MasterZivDima TС else я уже попадал как-то. Долго искал косяк в такой конструкции:


Наверное поэтому используют в таких случаях не if, а while(0)
с while(0) веселее получается. Тут вроде нет подводных камней? Разве что если несколько команд в одну строку написать через ;.
MasterZivMasterZiv,

А, ещё там лицензия типа "только в ознакомительных целях", не знаю, как на это реагировать...
Поставил дома неделю назад VS2012 for Desktop. (Надо было пример для VC2008 запустить) Т.к. она ставилась пару часов (качая кучу всякой всячины) то так и не запустил. Разобрался без нее.
Сейчас запустил. При первом старте сказала что 21 день остался и предложила зарегаться в микрософте. Отказался. Запустилась. Повторный запуск ничего не просит. Посмотрим что через 21 день скажет.

Попробовал в ней Win32 Console проект сделать. Получилось. printf("Hello world!");Sleep(1000); отработал. Надо попробовать как оно в W2000 и в линуксе с вайном пойдет.
Про только .NET я по старой памяти писал. Первый MSVC Express (2005 вроде) смотрел, расстроился что кроме .NET проектов нельзя в нем ничего сделать и забил. Похоже прогибается MS понемногу. И правильно. Лично я не сторонник ломаного софта, но и покупать не буду ради компиляции раз в год DLLки из пары сотен строк.
...
Рейтинг: 0 / 0
23.10.2013, 19:15
    #38438925
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
Dima TПоставил дома неделю назад VS2012 for Desktop. (Надо было пример для VC2008 запустить)


Я говорил про VS EXPRESS.
...
Рейтинг: 0 / 0
23.10.2013, 19:21
    #38438929
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
MasterZivDima TПоставил дома неделю назад VS2012 for Desktop. (Надо было пример для VC2008 запустить)


Я говорил про VS EXPRESS.
В заголовке написано: Microsoft Visual Studio Express 2012 for Windows Desktop

ЗЫ Похоже они там еще для телефонов и планшетов студий понаделали.
...
Рейтинг: 0 / 0
24.10.2013, 01:44
    #38439186
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
Dima TНадо попробовать как оно в W2000последняя студия, которая поддерживает W2K - это VS2008, можно разрабатывать в 2010й, но всё равно, использовать тулсет придётся от 2008й.
про линь с вайном не скажу, не знаю.
Лицензия у экспресса вполне себе позволяет разработку коммерческого софта, насколько я помню.
И в 2005й студии точно был С++, только WinSDK надо было отдельно качать, тоже бесплатно, впрочем.
...
Рейтинг: 0 / 0
24.10.2013, 03:27
    #38439203
valkot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
Dima T,

то бесплатная активация, где про 21 день. Формальность на минуту. И экспрес студия всегда была для C и сплюснутого. И для коммерческого исп. в т.ч. Вы как в танке.)
...
Рейтинг: 0 / 0
24.10.2013, 10:16
    #38439346
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
Думаю надо покопать в сторону альтернативных компиляторов. Как-то у МС все сложнее и замороченней продукты становятся.
Потребности у меня небольшие: собрать Win32 DLLку или утилитку без интерфейса (максимум с консолью). Это наверно все компиляторы смогут. А код набить можно и в Far`e.
...
Рейтинг: 0 / 0
24.10.2013, 11:08
    #38439459
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
Dima TА код набить можно и в Far`e.
ну зачем же так?
...
Рейтинг: 0 / 0
24.10.2013, 11:24
    #38439496
valkot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить препроцессор (не всё заменяет)
Dima TДумаю надо покопать в сторону альтернативных компиляторов. Как-то у МС все сложнее и замороченней продукты становятся.
Потребности у меня небольшие: собрать Win32 DLLку или утилитку без интерфейса (максимум с консолью). Это наверно все компиляторы смогут. А код набить можно и в Far`e.
да, да вы все правильно поняли - зачем разбираться с этим препроцессором, и вообще, в этом WinSDK все так сложно, ведь можно найти на свою точку опоры приключение поинтересней, например: запили лобзиком (например - тцц) свой гэцеце, цигвин и прочий гнус. Это ведь так просто. А главное - как раз то что надо, чтобы "собрать деэлельку и утилитку".
И эмаксЪ!
Если бы вы не страдали фигней, и действительно были бы заняты собиранием своей деэлельки и утилитки, вам ничего не стоило бы все свести лишь к тому минимуму, что вами надо, вплоть до набивания в командной строке имен компилятора и сборщика. Но вы не ищите простых путей. Думаю вам лучше не заморачиваться нб мелочи а сразу идти в собиратели ядра линупса.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите победить препроцессор (не всё заменяет) / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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