矛盾

2016-09-23 9 views
2

なぜfputwc()putwc()とタイプwchar_t代わりのwint_tputwchar()テイク引数? これは、対応する非ワイド文字関数fputc()putc()putchar()intを取る、ないcharと矛盾します。 wchar_tWEOF値を保持するために必要とされ、charEOF値を保持する必要がないためである矛盾

答えて

3

charについて

fputc()putc()putchar()機能はEOFそうintをそれらの両方を保持するために必要とされる負の数であってもよいunsigned charEOF範囲で両方の値を保持することができる値を受け入れる必要があります。

wchar_tのに対し、それ自体が最大のロケールとしてだけでなくWEOF文字を保持するために必要です。 WEOFは、wchar_tの内部に収まる値を表しますが、ロケールと重複しません。

これが原因charwchar_tの名前ではさらに混乱作られて、あなたはサイズはアーキテクチャ上のが、の大きさに依存しないintとしてcharが、それ以上のものとしてwchar_tを見るべきではありません最大のロケール(およびWEOFの値)。 201X 7.19.2:

WEOF 型の定数式に展開ISO/IEC 9899を引用 Why putchar, toupper, tolower, etc. take a int instead of a char?


wint_t値がdoe拡張文字セットのメンバーには対応していません。これは、ファイルの末尾がであることを示すために、この節のいくつかの関数によって受け入れられ(返され)、つまり、 ストリームからの入力は受け入れられません。 拡張文字セットのメンバーに対応しないワイド文字値としても使用されます。

Quoting your link

マクロWEOF値拡張文字セットの任意のメンバーとは異なるタイプwint_tの定数式に評価されます。

Quoting C++ Reference:その範囲の値のサポートされるロケールのうち指定された最大の拡張文字セットのすべてのメンバーのための個別のコードを表すことができる

wchar_t タイプ。

では、wchar_tは異なる基本的なタイプです(したがって、<cwchar>も他のヘッダーにも定義されていません)。

では、これは整数型のtypedefです。

+0

なぜこのCコードでgccは警告を出さないのですか? 'void f(char c){} void main(void){f((int)65);}'引数の型の不一致はありませんか?なぜ次のコードは警告も出さないのですか? '... putwchar(getwchar()); ...'定義によると、 'putwchar'の引数の型は** wchar_t **ですが、' getwchar'の戻り値の型は** wint_t **です。もう一度 - タイプミスマッチ。なぜ警告はコンパイラによって生成されないのですか? –

+0

** WEAT値を保持するために** wchar_t **が必要な場合は、なぜ** wint_t **が存在するのですか? –

+0

'WEOF'の正確な値は?リンクを引用するhttp://www.gnu.org/software/libc/manual/html_node/Extended-Char-Intro.html:「ISO 10646は31ビットの大きなコードスペースになるように設計されました」したがって、あなたの答えによると、 'WEOF'は有効なiso10646文字の場所を占有しなければなりません。これは 'EOF'との矛盾です:その値は有効な8ビット文字と一致しないように選択されました。なぜWEOF値が有効なiso10646文字の範囲から取られたのかを説明してください。 –