Какова цель случая s == NULL для mbrtowc?

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 .

6
задан R.. 26 January 2011 в 02:29
поделиться