6

多くのテキストは、整数としての値の処理は移植性がないことを警告していcharます。たとえば、「A」の値が65であると仮定します(ASCIIの場合のように)。

しかし、この文字セットがASCII(または拡張形式)なのか、それとも他の文字セットなのかを決定するものは何でしょうか。それはオペレーティングシステムによって決定されますか、それともコンパイラによって決定されますか?これはハードウェアに依存していないと思います。

たとえば、Intel PCは(理論的には)EBCDICなどの文字セットを持つことができますか?またLANG、Linux / Unixで環境変数を変更すると、Cプログラムの基本文字セットの値が変更される可能性がありますか(再コンパイルされた場合)?

(編集:Linuxのさまざまな非ラテン文字セットがすべて同じ基本ASCIIコードを持っていることがわかります。たとえば、KOI8-U -ASCIIと互換性のない文字セットを持つバリエーションがあると思いました)

4

3 に答える 3

4

標準は、「実装」のみが存在する限り、これらの詳細については気にしません。

実際には、ハードウェアとOSの両方で、そのプラットフォーム上のC実装が使用すると予想される実装の詳細、またはシステム機能(つまり、提供されるコード)と相互運用する場合に使用する必要がある実装の詳細を指定できます。 OSまたはハードウェアを使用)。そのため、「Win32では」などとよく言いsizeof(void*) == 4ます。ただし、これは省略形です。誰か選択した場合、32ビットWindowsで実行され、ポインターサイズが異なるC実装を作成できるためです。私たちが実際に意味しているのは、「Win32 ABIでは、Win32 ABIsizeof(void*) == 4に準拠していないWin32で実行されている、、およびCの実装は考慮から除外されている」ということです。

したがって、実装は、システムの規則に従うdllを(たとえば)使用できるかどうかを気にしない限り、好きなように実行できます。文字セットは定義できますが、コンパイラと標準ライブラリの作成者は、標準に含まれているものだけを条件として、好きなように定義できます。

とはいえ、文字リテラルの値はコンパイル時定数です。これは、実行時に基本実行文字セットを変更できないことを示しています。

さらに、環境変数に依存する場合は、プログラムがコンパイルされたときと同じ値で実行されるようにするのは誰かの責任です。これはかなりユーザーフレンドリーではありませんが、標準では、プログラムの実行方法に特有の制限があるC実装を誰かが作成することを実際に禁止していません。

于 2013-03-06T15:37:36.957 に答える
3

C標準はこれを言います:

C99の§5.2.1/1

2つの文字セットとそれに関連する照合シーケンスを定義する必要があります。ソースファイルが書き込まれるセット(ソース文字セット)と、実行環境で解釈されるセット(実行文字セット)です。各セットはさらに、この節によって内容が指定される基本文字セットと、拡張文字と呼ばれる0個以上のロケール固有のメンバー(基本文字セットのメンバーではない)のセットに分割されます。結合されたセットは、拡張文字セットとも呼ばれます。実行文字セットのメンバーの値は、実装によって定義されます。

setlocale(LC_ALL, "");起動時に、コンパイラはCロケールを使用する必要があり、が呼び出されたときにOSのロケールのみを取得します。

于 2013-03-06T15:35:34.227 に答える
1

クロスコンパイルが発生する可能性があるため、コンパイラーは、使用されるソースおよび実行文字セットを明確に判別します(たとえば、ASCIIを使用するLinuxボックスでEBCDICを使用するIBMメインフレームのコードをコンパイルする)。

于 2013-03-06T15:28:17.553 に答える