'avct'是合法的长值还是合法的var / const?

时间:2013-07-11 07:41:28

标签: c++ udp

我正在阅读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上没有问题?这些长的consts用作从客户端发送到服务器的命令。我设置了一个断点来观察价值,VS告诉我'avct' = 1635148660。我也尝试在整个解决方案中搜索“avct”,除了这些之外找不到匹配。所以请有人告诉我'avct'的价值是如何产生的。

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

2 个答案:

答案 0 :(得分:1)

历史上,原始C接受多字符字符 从历史的角度来看,常量,以及C和C ++都有。 与单个字符常量不同,类型为int,而 value是实现定义的(但通常包含 所涉人物的某种组合。)

实际上,新代码中应避免使用它们 不能在可移植代码中使用(因为实现确实有所不同 至于他们的意思)。

编辑:

它的价值:最典型的实现方式 或多或少相当于:

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

,将字符按顺序排列在c中(并忽略其中的任何字符 不合适 - 无论是第一个还是最后一个取决于 实现),然后使用i的值作为值。 这些结果显然取决于编码(但这是真的 任何字符常量),还有字节顺序等 和int的大小。因此,即使假设基于ASCII 编码,在我使用的系统上,结果可能是 0x617663740x746376610x63740x74630x61760x7661。 (这不考虑“异国情调”的架构 9位字节,或int的大小为6的位置。)

答案 1 :(得分:0)

感谢@chris我知道在stackoverflow上搜索什么(我不是说英语的人,所以找到正确的单词有点棘手): What do single quotes do in C++ when used on multiple characters?

我认为它使我的问题重复,所以我会自己回答。

'a'=0x61
'v'=0x76;
'c'=0x63
't'=0x74
'avct'=0x61766374=1635148660