int8_t* и символ*

Почему оператор const int8_t* cstr = "asdf"; выдает ошибку

invalid conversion from ‘const char*’ to ‘const int8_t*’

Разве int8_t* и char* не одинаковы? Я пропустил что-то тонкое здесь?!


person zeropoint    schedule 12.09.2012    source источник
comment
Они могут вести себя одинаково, но по-прежнему рассматриваются как разные типы. Кроме того, знак char не указан и может быть любым в зависимости от того, что выбирает реализация.   -  person Mysticial    schedule 12.09.2012


Ответы (2)


const signed char* не то же самое, что const char*. Проверьте настройки компиляции, потому что это объясняет. int8_t всегда (никогда не говори никогда =) по крайней мере везде, где я видел) определяется как signed char.

person WhozCraig    schedule 12.09.2012
comment
signed char никогда не совпадает с char. Они всегда разные. - person Kerrek SB; 12.09.2012
comment
Но разве char не обязательно должно быть либо signed, либо unsigned (для unsigned это понимается так, как мы явно пишем unsigned char) Тогда есть ли какое-то программное значение такого разграничения - потому что в любом месте для любой программы будет достаточно либо signed char, либо unsigned char? - person zeropoint; 12.09.2012
comment
@zeropoint char будет подписанным или беззнаковым, но в любом случае будет отличным от signed char и unsigned char типом. Это имеет то же значение, что и отдельные типы в C++. - person bames53; 12.09.2012
comment
char, signed char и unsigned char являются совершенно определенно разными типами и будут/должны рассматриваться как таковые, если только ваш компилятор не сгибает стандарт, чтобы он был «полезным» (свободный термин). Компилятор MS, например, позволяет конфигурации обрабатывать все «char» как «signed char» или «unsigned char», и хотя это звучит как звездная идея, у него есть самый неприятный побочный эффект, заключающийся в появлении множества ошибок компиляции. при переносе на компилятор, который действительно делает то, что должен; следуйте стандарту. - person WhozCraig; 12.09.2012
comment
Спасибо @Craig Nelson за подробные разъяснения - person zeropoint; 12.09.2012

Согласно [18.4 Целочисленные типы]:

typedef signed integer type int8_t; // optional

И [3.9.1 Основные типы]:

Обычный символ, знаковый символ и беззнаковый символ — это три разных типа.

int8_t — это целочисленный тип со знаком (в моей системе он определяется как signed char), а char и signed char — разные типы, поэтому они разные.

person Jesse Good    schedule 12.09.2012