Re: libpthreads,libmpeg3 -> windows
- From
- Alexander Pevzner ()
- To
- Boris Rudakov ()
- Date
- 2003-06-11T15:34:42Z
- Area
- CARBON.COPY
* Forwarded from area 'RU.UNIX.PROG'
From: Alexander Pevzner <pzz@pzz.msk.ru>
Hello, Boris Rudakov!
Wed, 11 Jun 2003 08:46:10 +0400 you wrote to Alexander Pevzner:
BR> AP> Кроме того, есть предупреждения, которые не все люди считают
BR> AP> осмысленными. Например, об смешении знаковости в выражениях. Или о
BR> AP> сравнении unsigned < 0. Во втором случае понятно, что условие
BR> AP> всегда не выполняется, но довольно удобно писать что-нибудь вроде
BR> AP> if( i < MIN_VALUE || i > MAX_VALUE )
BR> AP> error();
BR> AP> не задумываясь о том, равно MIN_VALUE 0 или не равно.
BR> Ээээээ, но ведь для этого есть временное включение/выключение варнинга
BR> ! Я бы написал так:
BR> #if defined(__BORLANDC__)
BR> # pragma warn -sig
BR> #elif defined(_MSC_VER)
BR> # pragma warning(once:xxxx) // Лень в сырцах код смотреть
BR> #endif
BR> if (i < MIN_VALUE || i > MAX_VALUE) error();
BR> #if defined(__BORLANDC__)
BR> # pragma warn .sig
BR> #endif
Заметь, ты превратил простую по сути вещь, в код, который:
1. Нельзя понять
2. Привязан к двум конкретным компиляторам
BR> Одно из них - темплейты. Поведение Гнуси для меня в большинстве случаев
BR> все-еще остается загадкой, а вот касаемом Борланда и Мелкософта верно
BR> следующее: они при анализе нагенеренного по темплейту "семантического
BR> дерева" (фиг их знает как они его называют) выражений используют
BR> несколько иные правила и генерят варнинги несколько
BR> иначе. Т.е. добиться при использовании темплейта ("condition is always
BR> [true/false]" почти не реально - они сначало вышвырнут конструкцию в
BR> ходе template instantiation, а потом уже будут делать вэлидэйшн и
BR> "радовать" тебя варнингами.
Т.е., ты предлагаешь не просто привязаться к конкретным компиляторам
(заметим, в коде, который вообще-то переносим), но еще и привязаться
к конкретным багам конкретных версий этих компиляторов?
BR> Зная такое их поведение, можно скрестить его с просто "хорошим тоном"
BR> программирования и существенно еще и повысить читаемость программы:
BR> template <class T> inline bool InRange(T& A, T& Lo, T& Hi) {
BR> return (A >= Lo) && (A <= Hi);
BR> }
BR> template <class T> inline bool OutOfRange(T& A, T& Lo, T& Hi) {
BR> return (A < Lo) || (A > Hi);
BR> }
BR> ...
BR> if (OutOfRange(i, MIN_VALUE, MAX_VALUE)) error();
Это хуже читается.
BR> * Варнингов не будет (отвечаю за Борланд и Инвижуал, в Гнуси до сих пор
BR> не
BR> копенгаген)
BR> * Это - КРАСИВО.
Это НЕ КРАСИВО. Это громоздко.
BR> С Гнусью я уже начинаю бороться, скоро мой код начнет обростать
BR> специфичными для нее прагмами :):):)
Мой проект - драйвер 802.11 для Linux и Windows. Весь содержательный
код (11 тыс. строк) общий для обеих систем. Знаешь, сколько у меня
раз в этом коде встречается #ifdef __GNUC__? Два раза, включая сишники
и хидеры. И один раз встречается #ifdef __linux__. Если бы я с самого
начала знал, что этот драйвер будет работать не только под линухом,
но и под форточками, #ifdef был бы только один :-)
BR> #ifdef __GNUC__
BR> # pragma Дизабле-все-варнинги-нах
BR> #endif
Похоже, у GCC нету такой прагмы.
BR> Кста, вообще говоря, хорошим тоном является ведение ДЛЯ ВСЕГО прокета
BR> одного Главного Инклуда (для каждого проекта, включая проекты либ,
BR> должен быть свой Главный Инклуд). Борланд с Мелкософтом к этому еще и
BR> хорошо подталкивают ведением precompiled headers, которые для каждого
BR> модуля
Мне пришлось так сделать, но это замедляет компиляцию. Я думаю,
это плохая идея.
BR> AP> Поэтому вопрос остается в силе: как сделать так, чтобы gcc выдавал
BR> AP> мне все предупреждения по моему коду, а к системным хидерам
BR> AP> относился снисходительно? Для меня это довольно актуально, на
BR> AP> самом деле.
BR> Моя идея подойдет ?
Ну только если ты мне скажешь фамилию прагмы, которая временно
выключает предупреждения :-)
BR> Из хороших сырцов, которые достойны подражания, такой подход
BR> практичсеки используется Борландом, Интелом, Мелкософтом, исходной
BR> командой Нетскейпа (я уже говорил что на меня произвела огромное
BR> впечатление архитектура, красота и аккуратность исходного коммерческого
BR> кода их браузера, и которую потом нахер испоганили линуксоиды, которым
BR> проект сдали на растерзание).
А почему этот бровсер так херово работал, не смотря на свою чудесную
архитектуру? Причем проблемы были не только в старом html engine (это-то
простительно), но и пользовательский интерфейс глючил нещадно, бровсер
падал на ровном месте и т.п.
BR> AP> Мой код собирается не только gcc'ом под Линух, но и Visual C под
BR> AP> форточки,
BR> ПРОВЕРЬ БОРЛАНДОМ !!!!!!! Не поленись ! Помяни мое слово - НЕ
BR> ПОЖАЛЕЕШЬ !
Борланд уже научился собирать NDIS'овские драйвера? :-)
На самом деле, ты не понимаешь. Я своими руками даже и не пытаютсь
собирать это под форточками (у меня и форточек-то нет).
BR> Есть только одна тонкость: правила преобразования типов в С++, особенно
BR> при параметризации темплейтов, мягко говоря нетривиальны. Количество
BR> правил ограничено, ANSI/ISO их давно устаканили, но их настолько много
BR> и они настолько того... долбанутые :)
У меня ANSI C. Мне, правда, пришлось вычистить все конструкции C99
из своего кода, мелкософт их до сих пор не понимает :-(
BR> Тебе же советую всегда все прогонять под Борландом и НИКОГДА не
BR> переключать Warnings с All на Selected - лови и устраняй все что
BR> Борланд найдет.
Когда-то я пользовался TurboC 2.0, и некоторые варнинги были глупыми.
Например, передача структуры по значению (как будто я не знаю, что
я передаю структуру по значению). Или вызов функции без прототипа,
при том, что реализация функции находится в зоне видимости компилятора
в точке вызова.
--
Wishes, Alexander Pevzner (pzz@pzz.msk.ru)
--- ifmail v.2.15dev5
* Origin: Private Node of Alexander Pevzner (2:5020/400)