1

私は GCC C プリプロセッサ -> トークン化を読んでいました。

前処理トークンは、次の 5 つの大まかなクラスに分類されます。

  1. 識別子
  2. 数値の前処理
  3. 文字列リテラル
  4. 句読点
  5. 他の。

その他の 1 文字は「その他」と見なされます。プリプロセッサの出力に問題なく渡されます。C コンパイラは、「その他」のトークンを含むソース コードをほぼ確実に拒否します。ASCII では、他の文字は「@」、「$」、「`」、および NUL (すべてのビットがゼロ) 以外の制御文字のみです。

私も Web を閲覧していて、'@' が文字の 1 つとして言及されている 'C Character Set' に出くわしました。「C 文字セット」の 1 つとして「@」に言及している記事は間違っていますか? または私の理解が間違っていますか?

ありがとう。

4

3 に答える 3

1

あなたの質問が完全に明確かどうかはわかりません。C と C++ の両方の標準では、コンパイラが Unicode のすべての文字をサポートする必要がありますが、必ずしも透過的な方法である必要はありません。コンパイラが入力を内部文字セットにマップする方法は、実装によって定義されます。しかし、この定義により、すべての@コンパイラは、$などを受け入れる必要があります。

特定の文字で何ができるかは別の問題であり、コメント、文字列リテラル、または文字リテラル (テキスト内のプリプロセッサ番号に解決される) にのみ表示される多くの文字 (@や など) があります。$見積もり)。たとえば、シンボルには_ 、Unicode タイプが文字または数字である文字のみを含めることができます (大まかに言えば、標準では、許可されている文字と許可されていない文字を正確に指定しています)。

実装が入力内の文字をソース文字セットにマップする方法は実装で定義されるため、コンパイラは 0x40 ( @ASCII、Latin-1、または Unicode の a) をシンボルで許可されている他の文字にマップできます。このルートをたどるものを私は知りません。実際、シンボル内の@orを許可したいコンパイラ$は、文字列リテラルに文字を含めることを不可能にするのではなく、単に非準拠であることを選択するのではないかと思います。

于 2013-07-25T12:59:20.847 に答える
0

設定したときに取得する文字セットを意味していると思いますLANG=Cか?

それはまったく同じことではありません。これは、基本的に「ASCII を使用する」というだけで、特別な追加機能がないロケールです。追加の翻訳ファイルや端末サポートは必要ありません。これは、すべてからデフォルトの出力を取得することを意味します。


あるいは、C プログラムに表示される可能性のある一連の文字を本当に意味していたのでしょうか?

C プログラムでは、これらの文字を引用符で囲んで使用する場合があることを忘れないでください。言語のキーワードや変数で意味を持たないからといって、ファイルに存在できないわけではありません。一方、たとえば C 文字列内に UTF-8 文字を含めるとエラーになる場合があります。

文字が C プログラム内で有効であるからといって、それがどこでも有効であるとは限りません。ifたとえば、キーワードは関数の外では無効です。

于 2013-07-25T12:46:50.150 に答える