我正在阅读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在我使用的系统上进行编码,结果可能是
0x61766374
,0x74637661
,0x6374
,0x7463
,0x6176
或0x7661
。 (并且这不考虑“异国”架构9位字节,或者
int
的大小为6。)