Сообщение Re[3]: char, signed char, unsigned char от 21.02.2017 16:44
Изменено 21.02.2017 19:21 N. I.
R>Вот как раз C, в отличие от C++, не требует чтобы char был отдельным типом:
Всё ж-таки требует, но через одно место:
The implementation shall define char to have the same range, representation, and behavior as either signed char or unsigned char. [Footnote: CHAR_MIN, defined in <limits.h>, will have one of the values 0 or SCHAR_MIN, and this can be used to distinguish the two options. Irrespective of the choice made, char is a separate type from the other two and is not compatible with either.]
Размещение такого уточнения в сноске похоже на нарушение регламента составления стандартов (если только из нормативной части не следует, что данные типы — непременно разные), но это обстоятельство вряд ли заставит кого-то трактовать стандарт C иначе.
Как следствие, вот такие варианты
char *p1 = 0;
signed char *p2 = 0;
int d = p2 - p1;
char *p1 = 0;
unsigned char *p2 = 0;
int d = p2 - p1;
по-любому являются ошибочными и для обоих требуется выдача компилятором какого-нибудь diagnostic message из-за нарушения constraints.
R>Вот как раз C, в отличие от C++, не требует чтобы char был отдельным типом:
Всё ж-таки требует, но через одно место:
The implementation shall define char to have the same range, representation, and behavior as either signed char or unsigned char. [Footnote: CHAR_MIN, defined in <limits.h>, will have one of the values 0 or SCHAR_MIN, and this can be used to distinguish the two options. Irrespective of the choice made, char is a separate type from the other two and is not compatible with either.]
Размещение такого уточнения в сноске похоже на нарушение регламента составления стандартов (если только из нормативной части не следует, что данные типы — непременно разные), но это обстоятельство вряд ли заставит кого-то трактовать стандарт C иначе.
Как следствие, вот такие варианты
ptrdiff_t char_ptr_diff(char *p1, signed char *p2)
{
return p1 - p2;
}
ptrdiff_t char_ptr_diff(char *p1, unsigned char *p2)
{
return p1 - p2;
}
по-любому являются ошибочными и для обоих требуется выдача компилятором какого-нибудь diagnostic message из-за нарушения constraints.