2011-10-26 48 views
11

我使用Windows上的Microsoft Visual Studio和uBuntu Linux上的GCC開發C++跨平臺。是否有可能讓GCC編譯帶BOM源文件的UTF-8?

在Visual Studio中,我可以在我的代碼使用unicode符號,如 「π」 和 「²」。 Visual Studio始終使用BOM(字節順序標記)將源文件保存爲UTF-8。

例如:

// A = π.r² 
double π = 3.14; 

GCC編譯高高興興地將這些文件只有當我第一次刪除BOM。如果我不刪除BOM,我得到的錯誤,像這樣的:

wwga_hydutils.cpp:28:9: error: stray ‘\317’ in program

wwga_hydutils.cpp:28:9: error: stray ‘\200’ in program

這使我想到了一個問題:

有沒有辦法讓GCC編譯UTF-8文件,而無需先刪除BOM ?


我使用:

  • Windows 7的
  • Visual Studio 2010中

和:

  • 的Ubuntu 11.10解夢
  • GCC 4.6.1

編輯(如的apt-get安裝GCC提供):

作爲第一評論者指出的那樣,我的問題是的BOM,但有字符串常量之外的非ASCII字符。 GCC不喜歡符號名稱中的非ASCII字符,但事實證明GCC與具有BOM的UTF-8完全兼容。

+2

在gcc 4.4.5中適用於我,在你的問題中使用一個包含兩個UNICODE字符的字符串。帶BOM的文件。另外,你得到的錯誤與BOM沒有任何關係,但似乎是所討論的UNICODE字符在任何字符串之外(這就是爲什麼他們被稱爲_stray_)。 –

+0

@JoachimPileborg是unicode字符在字符串之外,我用作符號名稱的「π」,「²」只是在註釋中。當我刪除BOM時,它確實消除了控制檯輸出中的錯誤,但我想這不是GCC真正處理角色的方式。 – Boinst

+0

@JoachimPileborg,我已經更新了這個問題,以包含我使用unicode字符的上下文。 – Boinst

回答

3

雖然統一標識符在GCC支持UTF-8輸入不。因此,unicode標識符必須使用\ uXXXX和\ UXXXXXXXX轉義碼進行編碼。但是,對於cpp預處理器,一個簡單的單行補丁允許gcc和g ++處理UTF-8輸入,前提是還安裝了支持C99轉換的iconv的最新版本。詳情出席

https://www.raspberrypi.org/forums/viewtopic.php?p=802657

不過,補丁是如此簡單,它可以在這裏給出。

diff -cNr gcc-5.2.0/libcpp/charset.c gcc-5.2.0-ejo/libcpp/charset.c 
*** gcc-5.2.0/libcpp/charset.c Mon Jan 5 04:33:28 2015 
--- gcc-5.2.0-ejo/libcpp/charset.c Wed Aug 12 14:34:23 2015 
*************** 
*** 1711,1717 **** 
    struct _cpp_strbuf to; 
    unsigned char *buffer; 

! input_cset = init_iconv_desc (pfile, SOURCE_CHARSET, input_charset); 
    if (input_cset.func == convert_no_conversion) 
     { 
     to.text = input; 
--- 1711,1717 ---- 
    struct _cpp_strbuf to; 
    unsigned char *buffer; 

! input_cset = init_iconv_desc (pfile, "C99", input_charset); 
    if (input_cset.func == convert_no_conversion) 
     { 
     to.text = input; 

即使使用該補丁,也需要兩個命令行選項來啓用UTF-8輸入。特別是,嘗試類似於

$ /usr/local/gcc-5.2/bin/gcc \ 
    -finput-charset=UTF-8 -fextended-identifiers \ 
    -o circle circle.c 
相關問題