68

私は私が使用できないことを見つけるために-fextended-identifiersオプションが有効になっている場合でも、g ++4.7で有効な識別子として:

int main(int argc, const char* argv[])
{
  const char*  = "I'm very happy";
  return 0;
}

main.cpp:3:3:エラー:プログラムmain.cpp:3:3の迷走'\ 360':エラー:プログラム
main.cpp:3:3の迷走'\ 237'
:エラー:迷走'\ 230'プログラム
main.cpp:3:3:エラー:プログラム内の「\203」の迷い

いくつかグーグルした後、UTF-8文字が識別子でまだサポートされていないことを発見しましたが、ユニバーサル文字名は機能するはずです。だから私は私のソースを次のように変換します:

int main(int argc, const char* argv[])
{
  const char* \U0001F603 = "I'm very happy";
  return 0;
}

main.cpp:3:15:エラー:ユニバーサル文字\U0001F603が識別子で無効です

したがって、明らかに有効な識別子文字ではありません。ただし、この標準では10000-1FFFD、Annex E.1の範囲の文字を明確に許可しており、E.2の最初の文字として許可していません。

私の次の努力は、他の許可されたUnicode文字が機能するかどうかを確認することでしたが、私が試したものはどれも機能しませんでした。これまでに重要なPILEOFPOO()キャラクターでさえありません。

それで、意味のある説明的な変数名のために、何が得られますか?-fextended-identifiersそれが宣伝するように行いますか?最新のビルドでのみサポートされていますか?また、他のコンパイラにはどのようなサポートがありますか?

4

3 に答える 3

25

4.8 の時点で、gcc は識別子として使用される BMP 以外の文字をサポートしていません。不要な制限のようです。また、gcc は、C 99および C++ 98に基づいて、 ucnid.tabに記述されている非常に制限された文字セットのみをサポートします(C11 および C++11 にはまだ更新されていないようです)。

マニュアルに記載されているように、-fextended-identifiers実験的であるため、期待どおりに動作しない可能性が高くなります。


編集:

GCC は 4.9.0 (正確にはsvn r204886 )から始まるC11 文字セットをサポートしました。したがって、OPの2番目のコードを使用しても機能します。ただし、 https: //gcc.godbolt.orgで GCC 8.2 を使用しても、実際のコードを使用して動作させることはできません ( @DanielWolfが提供するこのバグレポートに従うことをお勧めします)。\U0001F603-finput-charset=UTF-8

一方、両方のコードは、.clang 3.3 以外のオプションなしで動作します-std=c++11

于 2012-10-02T15:24:54.200 に答える
6

ただし、規格では、Annex E.1 で 10000 ~ 1FFFD の範囲の文字を明確に許可しており、E.2 では最初の文字として禁止していません。

C++ 標準で一部の機能が許可されている (または許可されていない) からといって、コンパイラがその機能をサポートしている (またはサポートしていない) とは限りません。

于 2012-10-02T15:31:33.113 に答える