Pourquoi le socket non valide est-il défini comme ~ 0 dans WinSock2.h (c ++)?

Dans WinSock2.h, le socket non valide et l’erreur de socket sont définis ainsi? Y a-t-il une signification à cela?

#define INVALID_SOCKET (SOCKET)(~0) #define SOCKET_ERROR (-1) 

Sur un système à complément à deux (et Windows est toujours un complément à deux), ~0 est égal à -1 , il n’y a donc aucune signification pour le compilateur.

Il peut y avoir une signification pour le lecteur: ~0 souligne qu’il s’agit d’une valeur avec tous les bits définis, tandis que -1 indique qu’il s’agit d’une valeur 1 inférieure à 0.

De côté:

Sur un système qui n’est pas un complément à deux et en supposant que SOCKET est un type non signé, il est généralement incorrect d’écrire (SOCKET)(~0) . La raison en est que sur de tels systèmes, ~0 ne représente pas la valeur -1, mais une des INT_MIN : INT_MIN , zéro négatif ou représentation d’ INT_MIN . Par conséquent, il ne convertira pas nécessairement en type SOCKET tant que valeur avec tous les bits nuls, mais convertira plutôt en INT_MAX+2 , 0 ou goodness-know-what (peut-être la valeur avec tous les bits définis).

Donc, généralement, vous devez initialiser les types non signés avec -1 pour obtenir la valeur avec tous les bits définis. Vous pouvez utiliser UINT_MAX , ou ~0UL , ou similaire, si vous connaissez le type non signé avec lequel vous traitez. Mais cela n’en vaut pas la peine, car -1 fonctionne pour tous les types non signés.

Il y a longtemps, tôt dans la matinée d’un jour de pluie et de froid, au milieu de collines verdoyantes et couvertes de brume dans une banlieue pittoresque mais en pleine croissance de Seattle, dans l’État de Washington, il y avait un petit groupe tentaculaire de bâtiments en briques rouges, dans l’un une salle de conférence de taille moyenne, réunissant un nombre croissant d’ingénieurs, de gestionnaires et d’architectes en logiciel de réseau. La réunion avait commencé assez tranquillement, le groupe majoritairement masculin sirotant leur tasse de thé et de café, faisant tournoyer leurs crayons mécaniques en griffonnant sur leur bloc-notes ou en grattant leur Palm Pilots (il y avait ce gars avec le Newton, mais tout le monde ignorait lui).

Alors que le présentateur continuait à faire défiler le code source, il avait été arrêté par l’un des 5 architectes de logiciels qui n’avaient pas été invités à la revue, mais qui s’étaient quand même présentés. “Qu’est-ce que c’est , je vous prie?”, Cria-t-il, agitant son doigt comme le président Clinton. Le présentateur s’est arrêté et a regardé le doigt, se trouvant en quelque sorte fasciné par le tremblement du doigt tandis que l’architecte continuait à s’agiter. “J’ai dit”, commença-t-il à répéter.

La présentasortingce a regardé l’écran et n’a rien remarqué de mal. “Qu’est-ce que tu racontes?” Il a demandé.

L’architecte haussa les sourcils, son visage exprimant d’abord la consternation, puis se tourna vers l’indignation, puis vers la constipation, en criant: ” C’est une violation flagrante des directives de style de codage!”.

Les observateurs se mirent à murmurer entre eux, se demandant de quoi il s’agissait. Mais le présentateur n’a pas été pris au dépourvu (le deuxième type), a rapidement remercié pour les commentaires reçus et a poursuivi l’examen.

“Je ne serai pas ignoré!”, Cria l’architecte en poussant un cri aigu, alors qu’il se levait soudainement, claquant ses paumes sur le dessus de la table avec une sorte de bruit sourd.

La salle a explosé alors que les poings martelaient la table et que les gestionnaires ont commencé à trouver des moyens de couvrir leurs arrières et que les ingénieurs ont commencé à feuilleter leurs manuels de codage, avec table des matières, index, notes de bas de page et références.

Le présentateur est resté extérieurement imperturbable, mais il se sentait énervé car il souhaitait désespérément que la revue soit complétée afin de pouvoir effectuer son voyage de ski à Snoqualmie. “Parlez-vous de l’inadéquation des types?”, Demanda-t-il avec désinvolture.

Un instant, l’architecte eut l’air pris au dépourvu, mais se recomposa rapidement. “De toute évidence”, il renifla.

Le présentateur a remplacé les deux caractères “-1” par “~ 0” et s’est retourné. L’architecte a examiné le changement, puis le rest de l’écran, puis a consulté ses notes, puis s’est finalement rassis.

Le rest de l’examen s’est déroulé sans incident.

Le plus souvent, c’est la négligence. -1 et ~ 0 sont effectivement la même chose.

Vous pourriez soutenir que ~ 0 est le meilleur style, car une socket est un entier non signé, mais en réalité, cela ne fait aucune différence, que ce soit pour des raisons pratiques.

Parce qu’ils utilisent “#define” au lieu de “const unsigned”, vous êtes toujours ouvert à l’étrangeté. par exemple

  unsigned a = SOCKET_ERROR; long long b = a; if (b != SOCKET_ERROR) std::cout << "????\n"; 

pourrait donner une surprise à certaines personnes.

parce que la SOCKET n’est pas signée, vous ne pouvez donc pas utiliser le (-1).

INVALID_SOCKET est utilisé pour les fonctions qui retournent un SOCKET , qui est un pointeur (un peu comme un HANDLE ). Sur les systèmes 32 bits, il s’agira d’une valeur 32 bits, tandis que sur les systèmes 64 bits, ce sera une valeur 64 bits.

Si correctement converti en un entier de taille équivalente, ce sera la même chose que -1 . Mais il est beaucoup plus prudent de ne pas supposer que ce sera toujours correctement lancé.

Chaque (-1) est (~ 0) mais chaque (~ 0) n’est pas (-1).