![](/img/trans.png)
[英]Why don't the C or C++ standards explicitly define char as signed or unsigned?
[英]Why doesn't C++ accept signed or unsigned char for arrays of characters
我在Visual Studio 2017中以純模式使用C ++。該編譯器編譯下面的語句而沒有抱怨:
const char * AnArrayOfStrings[] = {"z1y2x3w4", "Aname"};
但是,如果我更改上述語句以指定char是有符號或無符號的,則編譯器會發出C2440錯誤。 例如,下面的語句不編譯:
const signed char * AnArrayOfStrings2[] = {"z1y2x3w4", "Aname"};
const unsigned char * AnArrayOfStrings2[] = {"z1y2x3w4", "Aname"};
我沒有看到編譯器在明確表示char的符號時拒絕編譯語句的原因。
我的問題是:有沒有一個很好的理由我沒有看到編譯器拒絕編譯這些語句?
感謝您的幫助(我在StackOverflow中進行了研究,C ++文檔,我使用了Google,並且為了自己找到答案而咨詢了大量的C / C ++書籍,但仍有一個原因讓我望而卻步。)
"z1y2x3w4"
是const char[9]
並且沒有從const char*
到const signed char*
隱式轉換。
你可以使用reinterpret_cast
const signed char * AnArrayOfStrings[] = {reinterpret_cast<const signed char *>("z1y2x3w4"),
reinterpret_cast<const signed char *>("Aname")};
如果您編譯上面的代碼
const signed char * AnArrayOfStrings2[] = {"z1y2x3w4", "Aname"};
在C中使用gcc選項-Wall
然后它會發出以下警告
test.c:5:49: warning: pointer targets in initialization differ in signedness [-Wpointer-sign]
const unsigned char * AnArrayOfStrings2[] = {"z1y2x3w4", "Aname"};
^
test.c:5:49: note: (near initialization for 'AnArrayOfStrings2[0]')
test.c:5:61: warning: pointer targets in initialization differ in signedness [-Wpointer-sign]
const unsigned char * AnArrayOfStrings2[] = {"z1y2x3w4", "Aname"};
AnArrayOfStrings2
和"z1y2x3w4"
的元素類型不同。 AnArrayOfStrings2[0]
的類型為const signed char *
而"z1y2x3w4"
的類型為const char[9]
。
相同的代碼會引發C ++中的錯誤。 您需要使用顯式強制轉換才能使其在C ++中工作。
解釋原因
const char * AnArrayOfStrings[] = {"z1y2x3w4", "Aname"};
我會舉一個簡單的例子
const char c[] = "asc";
const char *p1 = c; // OK
signed const char *p2 = c; // Error
unsigned const char *p3 = c; // Error
在上面代碼片段的第二行中, c
將轉換為const char *
從而使p1
和c
兼容類型。
在第三行中, p2
和c
的類型是不兼容的,編譯器將在C ++中引發錯誤(C中的警告)。 第4行也會發生同樣的情況。
如果我們采用另一個int
類型的例子
const int i[] = {1,2,3};
const int *ii = i // OK
signed const int *si = i; // OK
unsigned const int *usi = i; // Error
前兩個指針初始化作為int
工作,沒有任何說明符等同於signed int
(但這不適用於char
),因此類型是兼容的。 在最后一種情況下,初始化失敗,因為const int *
或signed const int *
與unsigned const int *
不兼容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.