Pourquoi est-socket non valide définie comme ~0 dans WinSock2.h (c++)?
Dans WinSock2.h, les invalides douille et d'une douille d'erreur sont définis comme ceux-ci? Est-il une signification à cette?
#define INVALID_SOCKET (SOCKET)(~0)
#define SOCKET_ERROR (-1)
Probablement parce que la valeur est "facile à gérer". Ils auraient pu choisir autre chose, vraiment.
Notez que la question est quelque peu trompeuse. C++ ne permet pas de définir ce définir, il est d'une autre bibliothèque/API. La question est donc avec plus de précision demandé "pourquoi n'bibliothèque XYZ" définir en tant que tel. Et je suis assez sûr que la bibliothèque fonctionne sous C trop, de sorte que C ou C++ est tout à fait hors de propos à ce point.
WinSock2.h est l'en-tête principal pour MS Windows "WinSock" de la bibliothèque. C'est une partie du kit de développement logiciel Windows et est la plus commune de la mise en œuvre des sockets disponibles pour Windows. C'est presque compatible avec les sockets BSD. Vous êtes, bien sûr, juste qu'il utilise le même en-tête, en C et en C++.
Notez que la question est quelque peu trompeuse. C++ ne permet pas de définir ce définir, il est d'une autre bibliothèque/API. La question est donc avec plus de précision demandé "pourquoi n'bibliothèque XYZ" définir en tant que tel. Et je suis assez sûr que la bibliothèque fonctionne sous C trop, de sorte que C ou C++ est tout à fait hors de propos à ce point.
WinSock2.h est l'en-tête principal pour MS Windows "WinSock" de la bibliothèque. C'est une partie du kit de développement logiciel Windows et est la plus commune de la mise en œuvre des sockets disponibles pour Windows. C'est presque compatible avec les sockets BSD. Vous êtes, bien sûr, juste qu'il utilise le même en-tête, en C et en C++.
OriginalL'auteur unj2 | 2012-05-30
Vous devez vous connecter pour publier un commentaire.
Sur un deux est le système du complément (et Windows n'est toujours complément à deux),
~0
est égal à-1
, donc il n'y a pas d'importance pour le compilateur.Il y a peut être une signification pour le lecteur:
~0
souligne que c'est une valeur avec tous les bits set, alors que-1
souligne qu'il est d'une valeur de 1 à moins de 0.De côté:
Sur un système qui n'est pas en complément à deux, et en supposant que
SOCKET
est un type non signé, il est généralement mal à écrire(SOCKET)(~0)
. La raison en est que, sur de tels systèmes,~0
ne représente pas la valeur -1, c'est l'un desINT_MIN
, négatif, zéro, ou un piège de la représentation. Par conséquent, il ne sera pas nécessairement convertir typeSOCKET
comme la valeur avec tous les bits à zéro, mais bien plutôt de convertir commeINT_MAX+2
,0
, ou la bonté sait quoi (peut-être la valeur avec tous les bits set).Donc, en général, vous devez les initialiser unsigned types avec
-1
pour obtenir la valeur avec tous les bits définis. Vous pourrait utilisationUINT_MAX
, ou~0UL
, ou similaire, si vous savez quel type non signé, vous avez affaire. Mais c'est pas la peine, parce que-1
fonctionne pour tous les types non signés.Je hésitez pas à deviner ce que l'auteur de
winsock2.h
la pensée de la différence importante a été. Je vais vous dire quelle est la différence de I qu'il fait.OriginalL'auteur Steve Jessop
Il y a longtemps, en début de matinée, un froid jour de pluie, au milieu de misty green collines couvertes dans un pittoresque mais la croissance de la banlieue de Seattle, WA, il y avait un petit vaste amas de briques rouges de l'époque de bâtiments, dont l'un était un de taille moyenne salle de conférence, où un nombre croissant de logiciels de réseau des ingénieurs, des gestionnaires, et les architectes ont été de rassemblement. La réunion avait commencé tranquillement, avec la plupart des hommes du groupe en sirotant leurs tasses de thé et de café, en faisant tournoyer leurs crayons mécaniques, tandis que griffonner sur leurs blocs-notes, ou des gratte sur leur Palm Pilots (il n'y a que gars avec le Newton, mais tout le monde l'a ignoré).
Que le présentateur a continué à faire défiler le code source, il a été arrêté par l'un des 5 logiciels architectes qui avaient précisément pas été invité à l'examen, mais a montré de toute façon. "Ce qui, prie le dire, est que.", il a bouilli, en agitant son doigt, tout comme le Président Clinton. Le présentateur s'arrêta et regarda le doigt, se trouvant en quelque sorte hypnotisé par l'agitation de la doigt comme l'architecte a continué à remuer. "Je l'ai dit," il a commencé à répéter.
Le présentateur qui ont regardé l'écran, et n'a rien remarqué d'anormal. "De quoi parles-tu?" il a demandé.
L'architecte leva les sourcils, son visage a d'abord exprimé la consternation, puis tourné à l'indignation, puis à la constipation, comme il a crié "Que est flagrant style de codage de directive violation!".
Les observateurs ont commencé à chuchoter entre eux, se demandant ce que le problème a été tout au sujet. Mais, le présentateur a été interloqué (deuxième espèce), a vite fait merci pour les commentaires, et a poursuivi l'examen.
"Je vais pas être ignoré!", l'architecte a crié dans une forte pente, le crissement, comme il se leva soudain, claquant ses mains à la table avec une sorte de wimpy bruit sourd.
La salle a éclaté comme des poings s'abattirent sur le tableau et les gestionnaires ont commencé de trouver les moyens de couvrir leurs derrières et les ingénieurs ont commencé à le feuilleter leur style de codage des manuels, avec table des matières, index, notes de bas de page et des références.
Le présentateur est resté à l'externe imperturbable, mais a le sentiment contrarié, car il voulait avoir l'achèvement de l'examen, afin qu'il puisse aller sur son voyage de ski dans Snoqualmie. "Êtes-vous parler de l'incompatibilité de type?", il négligemment posée.
L'architecte, pour un moment, regarda interloquée, mais rapidement, recomposés lui-même, "Évidemment", il s'ébrouait.
Le présentateur a remplacé les deux caractères '-1' avec '~0' et se retourna. L'architecte scruté le modifier, puis le reste de l'écran, puis il a consulté ses notes, puis finalement assis dos.
Le reste de l'examen s'est déroulé sans incident.
OriginalL'auteur jxh
Surtout, il est de légèreté. -1 et ~0 sont effectivement la même chose.
On pourrait dire que l' ~0 est mieux de style, comme un socket est un unsigned int, mais en réalité il ne fait aucune différence à des fins pratiques.
Parce qu'ils utilisent des "#define" au lieu de "const unsigned" vous êtes toujours ouvert à l'étrangeté.
par exemple,
pourrait donner à certaines personnes une surprise.
OriginalL'auteur Michael J
parce que le SOCKET n'est pas signé, ne peut donc pas utiliser le (-1).
-1
pour divers autres types non signés dans l'API Win32. Ils aurait pu tout aussi bien faire la même chose, dans ce cas, par exemple:#define INVALID_SOCKET (SOCKET)(-1);
. Il est impossible de deviner pourquoi ils n'ont pas.C'est en fait la seule réponse correcte ici, même si c'est largement incomplète. Un SOCKET est non signé et pouvez pas -1 jamais. Une fonction qui renvoie un socket peut renvoyer une DOUILLE ou un code d'erreur qui est signé. C'est pourquoi ce sont des #défini de cette façon.
OriginalL'auteur RolandXu
INVALID_SOCKET
est utilisé pour des fonctions qui retournent unSOCKET
, un pointeur (un peu comme uneHANDLE
). Sur les systèmes 32 bits, il sera d'une valeur de 32 bits, alors que sur les systèmes 64 bits, il sera une valeur de 64 bits.Lorsqu'ils sont correctement exprimés en nombre entier de taille équivalente, qui sera la même que
-1
. Mais il est beaucoup plus sûr de ne pas supposer qu'il en sera toujours correctement exprimés.OriginalL'auteur Seth Noble
Tous (-1) a (~0), mais pas tous (~0) est (-1).
OriginalL'auteur guest_addon