Форум: "Прочее";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];
Вниз"-1" vs "NOT(0)" Найти похожие ветки
← →
Пробегал2... (2008-05-13 20:32) [0]Зачем в исходниках WinSock объявление сделали так:
INVALID_SOCKET = TSocket(NOT(0));
Если можно было бы просто:INVALID_SOCKET = -1 ;
Как например следом объявленный:SOCKET_ERROR = -1;
← →
Ketmar © (2008-05-13 21:02) [1]потому что TSocket не обязан быть со знаком?
← →
Renegat (2008-05-13 21:09) [2]> потому что TSocket не обязан быть со знаком?
{$EXTERNALSYM u_int}
u_int = Integer;
{$EXTERNALSYM u_long}
u_long = Longint;
{ The new type to be used in all
instances which refer to sockets. }
{$EXTERNALSYM TSocket}
TSocket = u_int;
winSock.pas
← →
Ketmar © (2008-05-13 21:11) [3]> Renegat (13.05.08 21:09) [2]
то, что в ранних Delphi не было u_int — не причина корёжить объявление. помедитируй на тему «что есть u_int в C» и «откуда взялся winsock.pas».
алсо, гугл по «автоматическая трансляция заголовков».
← →
Renegat (2008-05-13 21:15) [4]Впрочем, а какая разница?
← →
Renegat (2008-05-13 21:16) [5]TSocket(NOT(0)) = 0FFFFFFFFh = -1...
← →
Игорь Шевченко © (2008-05-13 21:16) [6]winsock.h
/*
* This is used instead of -1, since the
* SOCKET type is unsigned.
*/
#define INVALID_SOCKET (SOCKET)(~0)
#define SOCKET_ERROR (-1)
← →
Ketmar © (2008-05-13 21:17) [7]да никакой. к тому же делание дескриптора сокета беззнаковым — это опять m$-way. в нормальных системах оно знаковое, потому что при ошибке открытия принято возвращать -1. но то в нормальных системах, а то m$, которая даже bsd-код толком украсть не может.
← →
Palladin © (2008-05-13 21:23) [8]
> Ketmar © (13.05.08 21:17) [7]
ну, скажем, не вся ms, а отдельные ее представители иногда радуют своим видением )
← →
Ketmar © (2008-05-13 21:28) [9]ничего, в связи с перспективами, открывающимися от sua (или как там *nix-запускалка в виста ынтерпрайз зовётся?) со страхом жду m$ posix.
← →
Пробегал2... (2008-05-13 21:32) [10]Игорь Шевченко © (13.05.08 21:16) [6]
#define INVALID_SOCKET (SOCKET)(~0)
ммм... Тогда у меня вопрос - а почему в winsock.h объвлено именно так, а не просто:
#define INVALID_SOCKET -1
Или в Define нельзя использовать отрицательные числа? А приведение:
(socket)(-1)
вызвало бы ошибку... Так?
← →
Игорь Шевченко © (2008-05-13 21:35) [11]
> Тогда у меня вопрос - а почему в winsock.h объвлено именно
> так, а не просто:
наверное надо в оригинальный код BSD смотреть
← →
Ketmar © (2008-05-13 21:36) [12]> Пробегал2… (13.05.08 21:32) [10]
медитируем: «This is used instead of -1, since the SOCKET type is unsigned.»
что неясно? (-1) не определено для unsigned типов.
← →
Ketmar © (2008-05-13 21:39) [13]> наверное надо в оригинальный код BSD смотреть
есть мнение, что там нет отдельного типа, оно там вовсе даже int. потому что все fd типа int.
← →
Пробегал2... (2008-05-13 22:04) [14]Ketmar © (13.05.08 21:36) [12]
что неясно? (-1) не определено для unsigned типов
ну и что. Ведь там стоит приведение типов:(SOCKET)(~0)
ты хочешь сказать, что такое объявление:(SOCKET)(-1)
не сработало бы?
← →
Ketmar © (2008-05-13 22:24) [15]> ты хочешь сказать, что такое объявление:(SOCKET)(-1)не сработало
> бы?
какая размернсть у -1? приведение -1 к беззнаковому типу не расширяет знаковый бит. и если -1 было внутри компилятора размером shortint, например, то получится полная фигня. ку?
← →
Ketmar © (2008-05-13 22:25) [16]вдогон: таки гуглим про автоматическую трансляци. заголовков. сишный #define — вовсе не то же самое, что дельфийский const.
← →
Пробегал2... (2008-05-14 01:37) [17]Ketmar © (13.05.08 22:24) [15]
приведение -1 к беззнаковому типу не расширяет знаковый бит. и если -1 было внутри компилятора размером shortint, например, то получится полная фигня. ку?
а если ноль был внутри компилятора размером shortint, то NOT(0) также не расширяет знаковый бит. Ку?
← →
ketmar © (2008-05-14 01:41) [18]> Пробегал2… (14.05.08 01:37) [17]
ты моё «вдогон» прочёл? ты настолько наивен и считаешь, что в борланде всю ёту фиготень руками настукивали? #define там было, #define. а в Delphi аналога #define нет.
← →
Пробегал2... (2008-05-14 02:26) [19]ketmar © (14.05.08 1:41) [18]
ты моё «вдогон» прочёл?
прочитал. Причем здесь транслятор? разговор уже пошел, почему в Си заголовках объявлено так:#define INVALID_SOCKET (SOCKET)(~0)
ведь можно было так:#define INVALID_SOCKET (SOCKET)(-1)
← →
ketmar © (2008-05-14 02:33) [20]> Пробегал2… (14.05.08 02:26) [19]
нельзя. ну не определено -1 на беззнаковых. потому ~0 — это любой тип со всеми инвертированными битами (ибо явная операция). а (uint)(-1) — это запросто может быть байтовое -1, растянутое по правилам до uint (ибо приведение типов) — как компилятор захочет.
в первом случае имеем type tagging, во втором — type conversion. как конвертировать отрицательные в беззнаковые — не ясно.
← →
Пробегал2... (2008-05-14 02:56) [21]ketmar © (14.05.08 2:33) [20]
нельзя. ну не определено -1 на беззнаковых
погодь... Так не будет такое определение работать в Си:#define INVALID_SOCKET (SOCKET)(-1)
компилятор C+ реально выдаст ошибку?
ketmar © (14.05.08 2:33) [20]
как конвертировать отрицательные в беззнаковые — не ясно
ну например в Delphi ясно как. А про Си я не знаю просто...
Или ты говоришь о том, что заголовочный файл он для всех C+ компиляторов, а интерпретация такого define зависит от компилятора, и например на VC++ это будет работать, а где-то может и не сработать. Поэтому сделали через ~0?
← →
ketmar © (2008-05-14 03:24) [22]> компилятор C+ реально выдаст ошибку?
не знаю, бредни страуса не использую.
> ну например в Delphi ясно как.
цитату, плиз, где это написано. я вот не знаю. и не имею гарантии, что реализация компилятора не поменяется.
> Или ты говоришь о том, что заголовочный файл он для всех
> C+ компиляторов, а интерпретация такого define зависит от
> компилятора, и например на VC++ это будет работать, а где-
> то может и не сработать. Поэтому сделали через ~0?
примерно так. поскольку операция не определена, то отработать может как угодно, вплоть до ошибки компиляции.
← →
Anatoly Podgoretsky © (2008-05-14 08:57) [23]> Пробегал2... (14.05.2008 02:26:19) [19]
Потому что не ламеры
← →
Palladin © (2008-05-14 09:03) [24]в D6,D7 константа
INVALID_SOCKET = -1 ;
будет интерпретирована компилятором, как shortint и, позже, приведена к типу в контексте которого использована, не думаю, что ситуация изменилась и в более поздних версиях...
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.052 c