Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Определения |
Автор: gepard 19.5.2004, 12:01 |
Никак не могу догнать: вот есть __stdcall, а есть описание #define WINAPI __stdcall. Ведь по сути один хрен что использовать WINAPI или __stdcall. Тогда зачем нужно было описывать WINAPI, если можно писать __stdcall? Объясните чайнику. Почему я спрашиваю? Просто уже не раз на это натыкался. Например, описание: #define FLOAT float. И почему многие используют FLOAT, а не просто float. |
Автор: Anklav 19.5.2004, 12:17 |
Для переносимости. |
Автор: bel_nikita 19.5.2004, 12:19 |
Дело в том что #define ты можешь всегда изменить, a __stdcall нет. ![]() Пример: #define WINAPI __stdcall можно спокойно заметить на #define WINAPI __cdecl И твой софт работает по новому, без лишних телодвижений ![]() А прикинь если не было дефайна - геммор полный был бы ![]() |
Автор: chipset 19.5.2004, 15:41 |
А вот меня всегда мучал вопрос зачем GLfloat и GLsizei etc.... Для переносимости? Разве типа float нету на Маках или на *nix? |
Автор: setq 19.5.2004, 16:00 |
я думаю это сделано для того, чтобы прилетевшие с марса существа могли без проблем перенести quake на свои компьютеры. |
Автор: Anklav 19.5.2004, 16:40 | ||||||||
А где гарантия того, что тот же float будет такого же размера и на Win, и на Mak. Видь даже в любом справочнике/учебнике по C/C++ ничего толком не говорится, какого размера должны быть типы данных. Вот пример программы:
И вот то что вывело у меня под Windows (VC++ 6):
А это под Linux (gcc):
Как видно отличия только в типе long double, но не известно, как поведёт себя эта программа где-нибудь ещё. А вот GLfloat, GLint и т.д., дают гарантию того, что программа будет вести себя везде одинаково |
Автор: Sined 19.5.2004, 19:35 |
Строго говоря, для того, чтобы отличить свои апи от апей привнесенных(например созданных пользователем). Как замена одного красивого слова другим может повлиять на переносимость я в силу своей ограниченности понять не могу. |
Автор: chipset 20.5.2004, 01:34 |
typedef int GLint; вот такое в хидере gl.h, но int то одинаковые! хотя кажется в Turbo C он 2 байта... |
Автор: sergejzr 20.5.2004, 02:22 |
Мне кажется тема очень хорошая, сам не перестаю удивляться таким оборотам. Одно могу сказать, что также использовал дефайны, когда меня не били по рукам и мне гдето не хотелось заморачиваться красотой кода. Вообще то - ужасное решение. Так что пока поддерживаю мнение Sined'а. Пока конечно кто нибудь не приведёт действительно веского аргумента для этого безобразия. ________________________________________________________________________________________ PS: Где то я уже говорил, что при виде микрософтского кода создаётся впечатление, что во первых не существует концепта, во вторых его писало минимум 20 разных людей и в третьих, что так и не дописало. ![]() |
Автор: chipset 20.5.2004, 02:41 |
Я тоже пока поддерживаю Sined 'овское мнение... Вот тока может в реализации под какую нибудь другую систему, будет другой хидер...? |
Автор: DenDen 20.5.2004, 07:07 | ||
У мелкомягких больше 10000 человек штата, даже если учесть, что 90% из них менеджеры, то 1000 человек нечем заниматься(так что 20 это весьма приуменьшенная оценка). Насчет их кода 1 могу сказать--после дизассмблироания он выглядит достаточно красиво и логично...кусками. Единственное, что может и тут наблюдается эффект толпы--большая(!) группа из программистов(какие бы они ни были) пишет хуже, чем самый слабый из этой группы. |
Автор: Anklav 20.5.2004, 10:12 | ||||
MSDN:
Наверно это не сильный аргумент, но всё-таки.
Ну допистем, что где-небудь на unix тип int занимает 8 байт(а не 4, как на win), а тип short int - 4. Ну вот тогда в хидере gl.h напишут typedef short int GLint вместо typedef int GLint P.S: Сам не люблю эти typedef и #define, и поэтому даже если и пишу под win, то вместо всяких там UINT, BYTE ... - пишу unsigned int, char. Ещё больше всего меня убивает что-то типа LPCSTR, LPBYTE. И даже HWND мне никогда не нравилось. |
Автор: Sined 20.5.2004, 10:26 |
Вопрос вкуса. #defin'ы-- довольно простой способ сделать код лаконичнее и изящнее. Мне также жутко не нравилось в gcc вставлять struct во все дыры. Переносимость дело, конечно, хорошее, но учитывая, что почти с каждой новой версией меняются нафиг апи, вопрос стоит довольно абстрактно. |
Автор: gepard 20.5.2004, 14:51 |
Ок, пипл. Короче это нах*й не надо. Разве что удобства при кодинге. Нет я просто слышал, что там какая-то перегрузка прёт. ![]() Ну а почему тогда юзают FLOAT, а не float? И LONGLONG, а не __int64? |
Автор: DENNN 20.5.2004, 17:22 | ||
Я приведу. У меня есть приложение, работающее с БД. В качестве идентификаторов в MYSQL используются целые числа, а в MSSQL GUID. для того, чтоб скомпилить проект под какой-то сервер, достаточно изменить несколько дефайнов. P.S. кроме того, еще несколько дефайнов отвечают за то, как будет выглядеть интерфейс на любой платформе: XP или классика виндоус. |
Автор: chipset 20.5.2004, 17:28 |
Я вот к примеру LPCSTR очень даже уважаю! Хотя в последней OGL программе юзаю float'ы и std::string, |
Автор: Sardar 20.5.2004, 20:11 |
Я в С++ новенький, но мое мнение что языку не хватает строгой стандартизации, как в Ява например, что бы все типы не зависимо то обстоятельств были одного рамера и т.п. Например __int64 понимает не каждый компилятор... Но в стандарте также описать воможность задавать размеры примитивных типов во время компиляции. Конечно это тоже не выход, например если надо добвить новый тип. Тогда дефайны не плохое решение. Но все же я за конфигурационные файлы для компилеров, например: type __int64 as my_intern_64bit_type - и все это в XML и что бы всеми компилерами понималось.... |