Почему в вызовах Windows API, работающих с байтами (например, recv), используется char*, подписанный по умолчанию?

Я довольно новичок в c/ C++, и я пытаюсь следовать некоторым рекомендациям, которые предлагают использовать определенные типы stdint.h, где это возможно (uint8_tи т. д. вместо unsigned char).

Тем не менее, похоже, что когда вы вызываете API, который ожидает char* буфер (такой как recv), вы должны использовать любой тип, который диктует API.

Я не понимаю, почему, если вы читаете байты, вы не хотите, чтобы он был без знака, поэтому вы получаете значения от 0 до 255 вместо -128 и 127.

Я не знаю, если это зависит от реализации, но я только видел char по умолчанию подписано.

Ожидаете ли вы, чтобы результаты таких звонков передавались unsigned char* или же uint8_t* чтобы позволить вам интерпретировать более высокие положительные значения?

1 ответ

Решение

В Windows recv является частью Winsock API, который возник как клон API сокетов 4.2BSD. 4.2BSD предшествует ANSI C и void ключевое слово, поэтому он использует char * потому что это было самое близкое к общему указателю в то время.

Позже после void был изобретен, BSD и другие системы Unix обновили определение recvи теперь они все используют void *, Мотивация для этого изменения ясна: char * на самом деле это не универсальный указатель, его использование делает код более уродливым с большим количеством приведений. void * версия recv также обязано POSIX, поэтому единственный поставщик ОС, у которого его нет, это тот, кто меньше всего заботится о соответствии POSIX и эстетике кода... Microsoft.

Другие вопросы по тегам