2016-11-22 12 views
4

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

答えて

2

これは興味深い質問ですが、残念ながら答えはと考えています。です。この回答の残りの部分は私の意見でしかありません。

fputc家族は、関数のプロトタイプは存在さえしていなかったK & R C、の最初のバージョン以来存在する:あなたはどのようなパラメータの型に受け入れ機能と関数呼び出しで発生する可能性がない暗黙的な変換を知っている必要があります。 fgetc家族がintを返していましたように、対称fputc 1は、次の構文を許可するようにパラメータとしてint型を取ることを決定しました:

fputc(fgetc(fd1), fd2); 

fputcがcharを取っていた場合、それが書かれている必要があります(K & RC):fputc((char) fgetc(fd1), fd2);

しかし、恐竜だけがK & Rから覚えていて、関数呼び出しで暗黙の変換が行われるようになりました。したがって、ワイド文字セット関数が標準ライブラリに追加されたときには、wchar_tのみが使用されるため、ダブル変換を避けるために使用された部分をwchar_t - >wint_t - >wchar_tに渡すことになりました。そして、それはfputs定義の中で明示的である(鉱山を強調):

int fputc(int c, FILE *stream);
説明:FPUTC関数はstreamが指す出力ストリームに(符号なし 文字に変換)cで指定された文字を書き込み、 ...

だから、非常に一貫性はありませんが、私は誰もが本当に古いfputc家族機能の定義を変更することが必要であると考えていないと仮定し...

+0

'fputc'の定義は正しいです、変更する必要はありません - OPの根拠とここを読むhttp://stackoverflow.com/a/40732303/1487773/' fputwc'は間違っています - 同様の理由でwchar_tはcharと違いはありません - OPを参照してください) –

+0

ワイド文字のすべての関数は、自動プロモーションが役割を果たす場合を除いて、通常の文字の関数に似ていなければなりません。 –

関連する問題