wchar_tが導入されたISO C90標準では、 という表現は具体的ではありません。 このタイプでは、基本文字セットのすべての要素を格納できるだけです。 wchar_t
がうまくタイプchar
であってもよく、そしてwint_t
はタイプint
の 可能性があることを意味する`putwchar()`、 `fputwc()`、 `putwc()`の引数型が `wint_t`でないのはなぜですか?
。さらに、wchar_t
の一部の実装では、 と一部の符号なしで署名されている場合があります。状況はputchar()
とどのように違うのですか?
比較のために、putchar()
、putc()
とfputc()
の引数はint
なるように選択しました。
は、それらのいくつかは、EOF(putchar()
など)を使用していないにもかかわらず、我々はそのタイプchar
を作ることができないので、私は、単一 文字を処理するライブラリ関数のいずれも(のみint
で)char
で動作しないと思い、 それはchar
だった、と私たちは(char
の符号の有無が標準化されていません)unsigned char
に型キャスト場合、
void f(char c) { ...
...
int x = 't';
f((unsigned char)x);
...
warning: conversion to ‘char’ from ‘unsigned char’ may change the sign of the result
Sのようなタイプ 変換警告が存在することになるので、 o唯一のオプションは、int
です。これは符号付きと符号なしの両方を保持できますchar
。
がintまたはsigned charとして渡された場合でも、引数はputchar()によって自動的にunsigned char
に変換されますが、putwchar()では何も行われません。
それでは、なぜfputwc()
、putwc()
とputwchar()
はwchar_t
、ないwint_t
取りますか?標準の欠陥のようだ。私は明白な何かを欠いていますかglibcの基準から
見るとWhy argument type of putchar()
, fputc()
and putc()
is not char
?とInconsistency in definitions of fputwc(), putwc() and putwchar() in glibc
UPDATE
一部引用
wchar_t
はタイプwint_t
がとして定義する必要がありchar
として定義されている場合はパラメータのプロモーションのためです。
wchar_t
char
ように定義する正当だろう事実である、これらの機能は、 "1992年3月31日付けのISOワーキングペーパーSC22/WG14/N204" の正しいインタフェースを持っていた(います"ISO/IEC 9899:1990/Amendment 1:1995"を発行する前の最終草案)であるが、 "ISO/IEC 9899:1990/Amendment 1:1995"で変更された。ここをクリック
http://www.unix.org/version2/whatsnew/login_mse.html
'fputc'の定義は正しいです、変更する必要はありません - OPの根拠とここを読むhttp://stackoverflow.com/a/40732303/1487773/' fputwc'は間違っています - 同様の理由でwchar_tはcharと違いはありません - OPを参照してください) –
ワイド文字のすべての関数は、自動プロモーションが役割を果たす場合を除いて、通常の文字の関数に似ていなければなりません。 –