mbrtowc
указывается для обработки указателя NULL
для аргумента s
(указатель на многобайтовый символ) как следующее:
Если s - нулевой указатель, функция mbrtowc () должна быть эквивалентна вызову:
mbrtowc (NULL, "", 1, ps)
В этом случае, значения аргументов pwc и n игнорируются.
Насколько я могу судить, такое использование в значительной степени бесполезно. Если ps
не сохраняет какой-либо частично преобразованный символ, вызов просто вернет 0 без побочных эффектов. Если ps
хранит частично преобразованный символ, то, поскольку '\ 0'
недействителен в качестве следующего байта в многобайтовой последовательности ( '\ 0 '
может быть только завершением строки ator), вызов вернет (size_t) -1
с errno == EILSEQ
. и оставьте ps
в неопределенном состоянии.
Предполагаемое использование, по-видимому, заключалось в сбросе переменной состояния, особенно когда NULL
передается для ps
и используется внутреннее состояние, аналогично mbtowc
с кодировками с отслеживанием состояния, но это нигде не указано , насколько я могу судить, и это конфликтует с семантикой для mbrtowc
хранилища частично преобразованных символов (если бы mbrtowc
сбрасывал состояние при обнаружении байта 0 после потенциально допустимой начальной подпоследовательности, он не смог бы обнаружить эту опасную недопустимую последовательность).
Если mbrtowc
были указаны для сброса переменной состояния только тогда, когда s
равно NULL
, но не когда он указывает на байт 0, желаемое состояние - сбросить поведение было бы возможно, но такое поведение нарушило бы стандарт, как написано. Это дефект стандарта? Насколько я могу судить, нет абсолютно никакого способа сбросить внутреннее состояние (используется, когда ps
равно NULL
) после обнаружения недопустимой последовательности, и, таким образом, правильная программа не может используйте mbrtowc
с ps == NULL
.