powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите победить препроцессор (не всё заменяет)
25 сообщений из 26, страница 1 из 2
Помогите победить препроцессор (не всё заменяет)
    #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
Помогите победить препроцессор (не всё заменяет)
    #38437887
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

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

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

#define DEBUG_printf //

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

#define DEBUG_printf

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

Так у тебя не получился.
...
Рейтинг: 0 / 0
Помогите победить препроцессор (не всё заменяет)
    #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
Помогите победить препроцессор (не всё заменяет)
    #38438161
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T[/src]
смог откомпилировать
Код: plaintext
1.
("var=%d\n", iVar);


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

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


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


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

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

В общем, да.

Но ты можешь объявить макрос-функцию, и переопределять её либо в реальную функцию, либо в нично.
Но в данном конкретном случае функция-макрос должна иметь переменное кол-во параметров.
Это возможно только в современных С и С++, по последним стандартам. VC6 к этому не относится.
Он уже очень старый.
...
Рейтинг: 0 / 0
Помогите победить препроцессор (не всё заменяет)
    #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
Помогите победить препроцессор (не всё заменяет)
    #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
Помогите победить препроцессор (не всё заменяет)
    #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
Помогите победить препроцессор (не всё заменяет)
    #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
Помогите победить препроцессор (не всё заменяет)
    #38438600
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНаверно пора задумываться о чем-нибудь посвежее.

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

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

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

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


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

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


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


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

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

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

А, ещё там лицензия типа "только в ознакомительных целях", не знаю, как на это реагировать...
...
Рейтинг: 0 / 0
Помогите победить препроцессор (не всё заменяет)
    #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
Помогите победить препроцессор (не всё заменяет)
    #38438925
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПоставил дома неделю назад VS2012 for Desktop. (Надо было пример для VC2008 запустить)


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


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

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

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


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