2012-12-03 159 views
9

隨着MSVC 2010我嘗試在C或C++模式(需要在兩個編譯)和 編譯它不起作用。爲什麼?我認爲並在文檔中發現'\ x'將接下來的兩個字符作爲十六進制字符,而不是更多(使用\ X時4個字符)C字符串文字「字符太大」

我還了解到,沒有可移植的方式來使用字符代碼在C源代碼之外ASCII無論如何,所以我怎樣才能指定一些德國ISO-8859-1?

int main() { 
    char* x = "\xBCd"; // Why is this not char(188) + 'd' 
} 

// returns test.c(2) : error C2022: '3021' : too big for character 
// and a warning with GCC 
+0

'unsigned char' vs'char'? 'char'最有可能被簽名,在這種情況下127以上的值是「太大」。 – twalberg

+0

謝謝,但沒有。我也試過用unsigned char。相同的錯誤消息。 – Lothar

+0

@洛塔爾:我不是要成爲納粹分子,而是你的意思是ANSI C而不是ASCII C吧? ;)另外,你說得對,沒有真正的可移植的unicode方法。如果您使用的字符集大於8位,則需要自己指定編碼。檢查此帖:http://stackoverflow.com/questions/1421811/how-do-i-represent-a-unicode-character-in-a-literal-string-iso-ansi-c-when-the-c –

回答

13

不幸的是你這樣一個事實,即\x會讀這似乎是一個十六進制每次最後一個字符絆倒1,2,相反,您需要將其分解:

const char *x = "\xBC" "d"; /* const added to satisfy literal assignment probs */ 

考慮從該程序的輸出:

/* wide.c */ 
#include <stdio.h> 
int main(int argc, char **argv) 
{ 
    const char *x = "\x000000000000021"; 
    return printf("%s\n", x); 
} 

編譯和執行:

C:\temp>cl /nologo wide.c 
wide.c 

C:\temp>wide 
! 
  1. 測試微軟的C++編譯器附帶VS 2K12,2K10,2K8和2K5
  2. 測試在gcc 4.3.4
+1

我的Vim語法高亮顯示似乎同意這個規則。總之,'x'應該是'char const *'。 – bitmask

+1

另一種選擇是切換到八進制:'「\ 274d」'被解釋爲一個雙字符串,就像'「\ 2740」'一樣。 – user4815162342

+0

@bitmask:我相信你的意思是'const char *'。 'char * const'會聲明一個const指針,但這不是什麼需要在這裏const的 –