15

私は Apple のフレームワークを使用しており、次のようないくつかの sScriptingBridgeを含む iTunes のヘッダー ファイルを生成しました。enum

typedef enum {
    iTunesESrcLibrary = 'kLib',
    iTunesESrcIPod = 'kPod',
    iTunesESrcAudioCD = 'kACD',
    iTunesESrcMP3CD = 'kMCD',
    iTunesESrcDevice = 'kDev',
    iTunesESrcRadioTuner = 'kTun',
    iTunesESrcSharedLibrary = 'kShd',
    iTunesESrcUnknown = 'kUnk'
} iTunesESrc;

私の理解では、enum値は整数のようでなければなりませんでしたが、この定義はその規則に違反しているようです。enumさらに、これらの値を整数として (たとえば、 で)扱うことNSPredicateは正しいことをしていないようです。

enum上記の宣言を空のmain関数を含む C ファイルに追加し、i686-apple-darwin9-gcc-4.0.1. したがって、これらの種類のenums は C 標準に準拠していない可能性がありますが (Parappa が以下で指摘しているように)、少なくともgcc によって何らかの型にコンパイルされています。

では、その型とは何ですか?たとえば、書式文字列でどのように使用できますか?

4

4 に答える 4

18

C99、TC3 読み取り:

6.4.4.4 §2:

整数文字定数は、'x' のように単一引用符で囲まれた1 つ以上のマルチバイト文字のシーケンスです。[...]

6.4.4.4 §10:

整数文字定数の型は int です。1 バイト実行文字にマップされる単一の文字を含む整数文字定数の値は、整数として解釈されるマップされた文字の表現の数値です。複数の文字 ('ab' など) を含む整数文字定数の値、またはシングルバイト実行文字にマップされない文字またはエスケープ シーケンスを含む整数文字定数の値は、処理系定義です。整数文字定数に単一の文字またはエスケープ シーケンスが含まれる場合、その値は、値が単一の文字またはエスケープ シーケンスの値である char 型のオブジェクトを int 型に変換したときに得られる値です。

ほとんどの実装では、最大 4 文字の半角文字の整数文字定数を使用しても安全です。ただし、実際の値は異なるシステム間で異なる場合があります (エンディアン?)。


これは実際には、ANSI-C89 標準のセクション 3.1.3.4 で既に定義されています。

整数文字定数は、'x' または 'ab' のように単一引用符で囲まれた 1 つ以上のマルチバイト文字のシーケンスです。[...]

整数文字定数の型は int です。基本実行文字セットのメンバーにマップされる単一の文字を含む整数文字定数の値は、整数として解釈されるマップされた文字の表現の数値です。複数の文字を含む整数文字定数の値、または基本実行文字セットで表されない文字またはエスケープ シーケンスを含む整数文字定数の値は、処理系定義です。特に、char 型が signed char と同じ範囲の値を持つ実装では、1 文字の整数文字定数の上位ビット位置は符号ビットとして扱われます。

于 2009-02-14T01:26:09.393 に答える
6

一重引用符は、C の文字列ではなく文字を示します。したがって、各列挙型は、4 文字の文字コードで構成される 32 ビット値を持ちます。実際の値は文字エンコーディングによって異なりますが、8 ビット文字を想定しています。\0 が追加されていないことに注意してください。

通常の比較/割り当ての目的で列挙型を使用できます。他の列挙型と同様に、基になる型は整数です。

私は組み込みシステムでこの手法を何度も使用して、16 進ダンプ/デバッガーのコンテキストで人間が読める 4 文字の「名前」を作成しました。

于 2009-02-14T01:10:47.513 に答える
2

すでに述べたように、これらは文字定数を使用して宣言された整数です。

整数が複数の文字の文字定数を使用して宣言される場合、定数が開発されたマシンのバイト順序に影響されます。元のMacAPIはすべてPPCまたはそれ以前のマシン上にあったため、IntelLittle-Endianマシンに関しては逆になっています。

Intelのみを構築している場合は、手動で順序を逆にすることができます。

ユニバーサルバイナリを構築している場合は、 CFSwapInt32BigToHostなどのフリッピング関数を使用する必要があります。

これらのコードを修正しないと、コンパイラエラーがないかどうかに関係なく、PowerPCマシンでのみ機能するコードが残ります。

于 2009-02-14T02:22:53.440 に答える
0

これは C への Apple 拡張であり、基本的にこれらの列挙型を次のように変換します。

typedef enum {
    iTunesESrcLibrary = 'k'<<24 | 'L'<<16 | 'i'<<8 | 'b',
 ...
 }

編集:申し訳ありませんが、どうやらそれは有効なCです。私はそれらをMacコードでしか見ていないので、Apple固有であると誤って想定していました。

于 2009-02-14T01:20:20.313 に答える