Короткий ответ:
Строковые литералы, такие как "TEST"
, имеют тип char[]
в C.
Поэтому измените функцию, чтобы принять char*
. Или приведите аргумент к unsigned char*
, даже если это менее чистое решение.
Некоторая история создания char
:
Система типов C немного нефункциональна, когда дело доходит до типов символов. На заре времен, когда динозавры ходили по земле, не было указано, должно ли char
быть signed
или unsigned
по умолчанию.
signed
имеет смысл, потому что это делает char
совместимым с большими целочисленными типами. unsigned
также имело смысл, потому что не существует таблиц символьных символов с отрицательными индексами.
После стандартизации языка уже существовали различные компиляторы, которые давали char
разную подпись. Поэтому было решено, что подписанность char
должна определяться реализацией. То есть: решает каждый компилятор.
По той же причине типы char
, signed char
и unsigned char
были определены как 3 разных типа. Это означает, что вы не можете неявно преобразовывать указатели на эти типы. Вместо этого вам нужно использовать явное преобразование путем приведения типов.
Только типы персонажей ведут себя так странно. Если взять, например, int
и signed int
, они всегда совместимы, а int
всегда подписано.
Это известный недостаток языка C. Таким образом, типы из библиотеки stdint.h
предпочтительнее «сырых» типов символов.
Рекомендации по использованию типов символов:
- Используйте тип
char
, если вы имеете дело с текстовыми строками (до 8 бит), и только в этом случае.
- Используйте тип
unsigned char
или uint8_t
, если вы имеете дело с необработанными двоичными данными или выполняете каламбуры и т. д.
- Используйте
signed char
или int8_t
, если вы выполняете арифметические операции с 8-битными целыми числами со знаком.
- Используйте
unsigned char
или uint8_t
, если вы выполняете арифметику 8-битных целых чисел без знака.
- Никогда не возникает опасности при преобразовании между различными типами символов, если не имеет значения подписанность.
- Но... будьте осторожны, выполняя какие-либо арифметические действия с этими типами, так как они сопряжены со многими ловушками. См. правила продвижения неявного типа.
person
Lundin
schedule
08.11.2018
signed char *
? - person Sourav Ghosh   schedule 08.11.2018char
, это не так.char []
не может быть автоматически преобразовано ни вsigned char*
, ни вunsigned char *
. - person HolyBlackCat   schedule 08.11.2018char[N]
- person M.M   schedule 08.11.2018char
зависит от реализации, не так ли? - person Sourav Ghosh   schedule 08.11.2018char
подписано или не подписано, зависит от реализации. Я считаю, что для реализации, где простоеchar
равноunsigned
, приведенный выше код не должен выдавать никаких предупреждений. - person Sourav Ghosh   schedule 08.11.2018signed char
иunsigned char
. Даже если одинаковая подписанность как у того, так и у другого. - person M.M   schedule 08.11.2018char
- единственный случай, когдаchar
иsigned char
упоминаются как разные типы в стандарте.int
, с другой стороны, этоsigned int
- по умолчанию, поэтому они одного типа. - person Sourav Ghosh   schedule 08.11.2018