2016-11-23 7 views
2

次の2つのプログラムでキャストがwint_twchar_tになることが保証されていますか?`wint_t`と` wchar_t`にキャストする方法は?

#include <locale.h> 
#include <wchar.h> 
int main(void) 
{ 
    setlocale(LC_CTYPE, ""); 
    wint_t wc; 
    wc = getwchar(); 
    putwchar((wchar_t) wc); 
} 

-

#include <locale.h> 
#include <wchar.h> 
#include <wctype.h> 
int main(void) 
{ 
    setlocale(LC_CTYPE, ""); 
    wchar_t wc; 
    wc = L'ÿ'; 
    if (iswlower((wint_t) wc)) return 0; 
    return 1; 
} 
wint_t

signed int、及びWEOF == ((wint_t)-1)であり、(この 仮想的な実装はBMPに制限されている)wchar_tsigned shortである場合を考えます。次に(wint_t)U+FFFFWEOFと区別できない です。はい、U+FFFFは予約済みのコードポイントですが、 はまだ衝突しています。

既存の実装の徹底的な監査なしでは、これが決して実際には起こらないと私は誓いたくはありません。

はあなたが記述環境にもMay wchar_t be promoted to wint_t?

+0

wint_tについて言及する標準はありません。 – gnasher729

答えて

1

を参照してください、wchar_tは正確にBMPを記述することはできません。そのタイプはwchar_tに相当符号なしあるようL'\uFEFF'wchar_tの範囲を超えています。 (C11 6.4.4.4文字定数p9)。それをwchar_tに格納すると、signed shortと定義され、16ビットのショーツがその値を変更します。

一方、ソースコードに使用されている文字セットがUnicodeであり、コンパイラが正しくエンコードを解析するように正しく設定されている場合、の値は255であり、2番目の例のコードは完全です。定義され、明確である。

intは32ビット幅とshort 16ビット幅である場合、int又はunsigned shortいずれかとwchar_tを定義するために、はるかに一貫性と思われます。 WEOFは、すべてwchar_tの値または少なくともUnicodeコードポイントを表すすべての値と異なる値である(-1)と定義できます。

+0

'(-1)'を 'unsigned short'に戻すことは、ユニコードの有効な文字である0xFFFFに相当します。何か忘れていますか? –

+0

中間段落でUTf-8とコードポイントを混同しているようですが、UTF-8ではオクテット255が無効で、UTF-8の 'L'î 'はC3 BFの2つのオクテットとしてエンコードされています。 –

+0

@PeteKirkham:わかりやすく解答しましたが、文字セットとファイルのエンコーディングは2つの異なる問題です。エンコーディングが正しく、適切に構成されている限り、エンコーディングは心配していません。 – chqrlie

関連する問題