0

AVChatのソースコードを読んでいます。UDP と DirectShow を使用したビデオ チャット プログラムです。ただし、ヘッダー ファイルGlobalDef.hには、次のような定義がいくつかあります。

// Messages
const long msg_FilterGraphError = 'avct' + 1;
const long msg_MediaTypeReceived    = 'avct' + 2;
const long msg_TCPSocketAccepted    = 'avct' + 3;
const long msg_UDPCommandReceived   = 'avct' + 4;
const long msg_ModifyFilterGraph    = 'avct' + 5;

// Let the main thread modify filter graph
#define WM_ModifyFilterGraph        (WM_USER+123)

// UDP command defines
const long MAX_COMMAND_SIZE     = 100;
const long cmd_ClientCalling    = 'avct' + 100;
const long cmd_DeviceConfig     = 'avct' + 101;
const long cmd_BuildFilterGraph = 'avct' + 102;
const long cmd_DisconnectRequest    = 'avct' + 103;

単一の文字を囲むために使用されると思っ''たのに、なぜこのコードが私の VS2010 で問題なく実行されるのでしょうか? これらの長い const は、クライアントからサーバーに送信されるコマンドとして使用されます。値を監視するためにブレークポイントを設定すると、VS が教えてくれ'avct' = 1635148660ます。また、ソリューション全体で「avct」を検索しようとしましたが、これら以外に一致するものは見つかりませんでした。'avct'では、値がどのように生成されるのか誰か教えてください。

編集:''複数の文字を間に入れて char 変数に渡すと、最後の文字のみが転送される ことがわかりました。エラーが報告されない理由'avct'を説明できますが、値がどのように生成されるかはまだわかりません。

4

2 に答える 2

1

歴史的に、元の C は複数文字の文字定数を受け入れており、歴史的な理由から、C と C++ の両方が今でも受け入れています。単一文字の定数とは異なり、型はintで、値は実装定義です (ただし、通常は、関連する文字の何らかの組み合わせで構成されます)。

実際には、新しいコードでは避けるべきであり、移植可能なコードでは使用できません (実装によって意味が異なるため)。

編集:

価値があるのは、最も典型的な実装は、多かれ少なかれ次のものと同等です。

union
{
    char c[sizeof(int)];
    int i;
};

、文字を順番に配置しc(実装に応じて最初か最後かにかかわらず、適合しなかったものは無視します)、値iとして の値を使用します。これらの結果は明らかにエンコーディングに依存しますが (ただし、これはすべての文字定数に当てはまります)、バイト順や のサイズなどにも依存しますint。したがって、ASCII ベースのエンコーディングを想定しても、私が使用したシステムでは 、結果0x61766374は、、、、、または . (これは、9 ビット バイトの「エキゾチックな」アーキテクチャ、または an のサイズが 6 の場合を考慮していません。)0x746376610x63740x74630x61760x7661int

于 2013-07-11T08:07:11.123 に答える
0

@chrisのおかげで、stackoverflow で何を検索すればよいかがわかります (私は英語を話せないので、正しい単語を見つけるのは少し難しいです):

私の質問が重複していると思うので、自分で答えます。

'a'=0x61
'v'=0x76;
'c'=0x63
't'=0x74
'avct'=0x61766374=1635148660
于 2013-07-11T08:00:19.930 に答える