2011-10-26 31 views
11

WindowsでMicrosoft Visual Studioを使用し、uBuntu LinuxでGCCを使用してC++クロスプラットフォームを開発しました。GCCでBOMソースファイルを使用してUTF-8をコンパイルすることはできますか?

は、Visual Studioで、私は私のコードで "²" "π" と同様にUnicodeの記号を使用することができます。 Visual Studioは、ソースファイルを常にBOM(Byte Order Mark)付きの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は、最初のBOMを削除せずにUTF-8のファイルをコンパイルするために取得する方法はあります?


私が使用しています:

  • のWindows 7
  • のVisual Studio 2010

と:

  • のUbuntu oneiricの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はいユニコード文字は文字列の外にあり、シンボル名として使用していた「π」は、「²」はコメントにすぎませんでした。 BOMを削除すると、コンソールの出力からエラーが取り除かれますが、GCCが実際にどのように文字を処理しているかはわかりません。 – Boinst

+0

@ JoachimPileborg、私はユニコード文字を使用しているコンテキストを含めるように質問を更新しました。 – Boinst

答えて

2

GCC Wikiによると、これはまだサポートされていません。 -fextended-identifiersを使用してコードを事前処理して、識別子をUCNに変換することができます。リンク先のページから:

perl -pe 'BEGIN { binmode STDIN, ":utf8"; } s/(.)/ord($1) < 128 ? $1 : sprintf("\\U%08x", ord($1))/ge;' 

も参照してくださいg++ unicode variable nameとUnicode識別子は、GCCでサポートされていますが

3

Unicode Identifiers and Source Code in C++11?、UTF-8入力ではありません。したがって、\ uXXXXおよび\ UXXXXXXXXエスケープコードを使用して、Unicode識別子をエンコードする必要があります。しかし、cppプリプロセッサへのシンプルな1行パッチでは、C99変換をサポートするiconvの最新バージョンもインストールされていれば、gccおよびg ++はUTF-8入力を処理できます。詳細は、しかし、パッチは、それはここ与えることができるので簡単です

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入力を有効にするには2つのコマンドラインオプションが必要です。特に、次のようなものを試してください

$ /usr/local/gcc-5.2/bin/gcc \ 
    -finput-charset=UTF-8 -fextended-identifiers \ 
    -o circle circle.c 
関連する問題