引入了wchar_t的ISO C90標準並沒有說明關於該表示的任何具體內容。它只需要 這種類型能夠存儲基本字符集的所有元素。爲什麼參數類型的`putwchar()`,`fputwc()`和`putwc()`不是`wint_t`?
這意味着wchar_t
可能是char
類型,並且wint_t
可以是int
類型的 。此外,在一些實現中,wchar_t
可以被簽名, 並且在一些 - 無符號的。情況與putchar()
有何不同?
爲了比較,的putchar()
,putc()
和fputc()
參數選擇爲int
。
我認爲,沒有任何的庫函數,其處理單 字符char
(僅適用於int
)工作,因爲即使 他們中的一些不使用EOF(像putchar()
),我們不能使其char
類型, 因爲如果它是char
,我們強制轉換爲unsigned char
(的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
。
儘管通過putchar()函數自變量轉換爲unsigned char
,即使它是作爲int或signed char傳遞的,但在putwchar()函數中不會執行任何操作。
那麼,爲什麼fputwc()
,putwc()
和putwchar()
採取wchar_t
,不wint_t
?看起來像標準中的缺陷。我錯過了明顯的東西嗎?
參見和Why argument type of putchar()
, fputc()
and putc()
is not char
?和Inconsistency in definitions of fputwc(), putwc() and putwchar() in glibc
UPDATE
如果
wchar_t
被定義爲char
從glibc的參考一些報價wint_t
必須定義爲類型由於參數提升。
這將是合法的定義
wchar_t
爲char
是事實,這些功能已經在 「ISO工作文件SC22/WG14/N204月31日1992年3月」 正確的接口(其中是發佈「ISO/IEC 9899:1990 /修訂版1:1995」之前的最終草案),但在「ISO/IEC 9899:1990 /修訂版1:1995」中進行了修改。看到這裏http://www.unix.org/version2/whatsnew/login_mse.html
'fputc'的定義是正確的,它不需要改變 - 閱讀OP的基本原理,這裏http://stackoverflow.com/a/40732303/1487773/和'fputwc'是不正確的 - 出於同樣的原因因爲wchar_t與char沒有區別 - 請參閱OP) –
寬字符的所有功能都必須類似於普通字符的功能,不包括自動提升發揮作用的情況。 –