Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.22;
Скачать: CL | DM;

Вниз

"-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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.019 c
2-1212056258
slimer
2008-05-29 14:17
2008.06.22
Результат TQRExpr


3-1200759708
Ega23
2008-01-19 19:21
2008.06.22
Список системных таблиц FireBird и ещё кое-что


15-1210271563
AlexDan
2008-05-08 22:32
2008.06.22
Поиск в сети..


3-1200847939
Ega23
2008-01-20 19:52
2008.06.22
FB + IBExpert


1-1195029359
tytus
2007-11-14 11:35
2008.06.22
TSimpeObjectBroker - как переключить клиента на другой сервер?