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 上运行没有问题呢?这些长常量用作从客户端发送到服务器的命令。我设置了一个断点来观察值,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, 0x74637661, 0x6374,或 . (这不考虑具有 9 位字节的“奇异”架构,或者 an 的大小为 6。)0x74630x61760x7661int

于 2013-07-11T08:07:11.123 回答
0

感谢@chris,我知道在stackoverflow 上要搜索什么(我不会说英语,所以找到正确的单词有点棘手): 在C++ 中用于多个字符时,单引号有什么作用?

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

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