Почему в вызовах 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.