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)