В разделе, посвященном 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 будет в порядке. (За исключением того, что упомянутая выше сноска, похоже, противоречит этой интерпретации.)