我正在阅读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上运行没有问题?这些长常量用作从客户端发送到服务器的命令。我设置了一个断点来观察值,VS告诉我'avct' = 1635148660。我还尝试在整个解决方案中搜索“ avct”,但除此以外没有其他匹配项。因此,请告诉我'avct'的值是如何生成的。

编辑:
我发现,如果在''之间放置多个字符并将其提供给char变量,则只会传输最后一个字符。这可以解释为什么'avct'不会报告错误,但是我仍然不知道该值是如何生成的。

最佳答案

从历史上看,原始的C接受多字符字符
常量,并且C和C ++仍会根据历史依据进行操作。
与单字符常量不同,类型为int,而
值是实现定义的(但通常包含
所涉及字符的某种组合)。

实际上,应该在新代码中避免使用它们,并且
不能在可移植代码中使用(因为实现方式会有所不同
关于他们的意思)。

编辑:

对于它的价值:最典型的实现是
大致相当于:

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


,将字符按顺序放在c中(并忽略任何
不适合-第一个还是最后一个取决于
实现),然后将i的值用作该值。
这些结果显然取决于编码(但这是事实
任何字符常量),也可以用于字节顺序
int的大小。因此,即使假设基于ASCII
在我使用的系统上进行编码,结果可能是
0x617663740x746376610x63740x74630x6176
0x7661。 (并且这不考虑“异国”架构
9位字节,或者int的大小为6。)

08-25 08:13