Подтвердить что ты не робот

Can isdigit законно зависит от языка в C

В разделе, посвященном setlocale, стандарт ANSI C указывает в сноске, что только функции ctype.h, поведение которых не зависит от текущей локали, isdigit и isxdigit.

Реализация isdigit от Microsoft зависит от локали, потому что, например, в локалях с использованием кодовой страницы 1250 isdigit возвращает только ненулевое значение для символов в диапазоне 0x30 ('0') - 0x39 ('9'), тогда как в локалях с использованием кодовой страницы 1252 isdigit также возвращает ненулевое значение для надстрочных цифр 0xB2 ('²'), 0xB3 ('³') и 0xB9 ('¹').

Является ли Microsoft нарушением стандарта C, заставляя зависящую от языка языку?

В этом вопросе меня интересует прежде всего C90, который Microsoft утверждает, что он соответствует, а не C99.

Дополнительный фон:

В собственной документации Microsoft setlocale неправильно указано, что isdigit не зависит от части LC_CTYPE локали.

Раздел стандарта C, который охватывает функции ctype.h, содержит некоторую формулировку, которую я считаю неоднозначной:

Поведение этих функций зависит от текущей локали. Те функции, которые имеют специфические для локали аспекты только тогда, когда не в локали "C" отмечены ниже.

Я считаю это неоднозначным, потому что неясно, что он пытается сказать о таких функциях, как isdigit, для которых нет заметок о специфических для локали аспектах. Возможно, он пытается сказать, что такие функции следует считать зависимыми от языка, и в этом случае реализация isdigit в Microsoft будет в порядке. (За исключением того, что упомянутая выше сноска, похоже, противоречит этой интерпретации.)

4b9b3361

Ответ 1

  • Microsoft всегда прав.
  • Если Microsoft не прав, см. пункт 1

Microsoft всегда имеет собственную интерпретацию спецификации. И обычно предложение: "Но Microsoft ошибается", не несет никакого веса с вашим генеральным директором, поэтому вам нужно кодировать ошибки/интерпретации MS.

Количество кода, поддерживающего неправильное поведение IE и Outlook, колеблется.

Во многих случаях единственным решением является развертывание собственной версии функции, которая делает правильную вещь и делает что-то вроде этого:

int my_isdigit( int c )
{
#ifdef WIN32
  your implementation goes here
#else
  return isdigit( c );
#endif
}

Ответ 2

Требуемый набор символов определен в разделе 2.2.1. Затем в разделе 2.2.1.2 описывается поведение символов расширения:

  • Должны присутствовать однобайтовые символы, определенные в $2.2.1.
  • Наличие, значение и представление любых дополнительных элементов зависит от локали.