这个变量的C语言定义意味着

时间:2013-11-21 17:41:47

标签: c

const u_int16  myDeviceDescriptor [] = "\p"
"\x12" // Length
 "\x01" // Type (Device Descriptor)

意思是什么,\ x12或\ p

3 个答案:

答案 0 :(得分:3)

您的代码段似乎是USB协议实现的一部分。 uint_16数组被写为几个小字符串的串联,以方便可读性。每个十六进制值后跟其含义写为注释。

\p表示“Pascal string”。它是一个相当古老的结构,并非在所有编译器上都可用。它需要-fpascal-strings

答案 1 :(得分:1)

在标准C中,“\ x12”表示包含值为18的字符的字符串(十六进制12 16 ),“\ x01”是包含值为1的字符的字符串。{{ 1}}不是标准的C转义序列,但它可以是扩展名。

在标准C中,像这样的三个连续字符串被连接成一个字符串(并以空字符结尾)。生成的字符串可用于初始化字符数组("\p"charunsigned char数组。

signed char被声明为myDeviceDescriptor的数组。除非u_int16u_int16typedefchar的别名(通过unsigned char),否则未定义使用此字符串初始化signed char按C标准。尽管myDeviceDescriptor可能是这样的别名,但除非此代码是为具有16位字节的特殊环境编写的,否则不太可能。

此语法可能是特定于其设计的C实现的扩展,这是一个允许使用字符串文字初始化u_int16数组的扩展。

您需要有关C实现的文档或有关此代码的其他特定信息,以确定u_int16是什么以及是否支持此扩展。

另一种可能性是代码错误。

答案 2 :(得分:1)

正在进行编译时字符串连接。当你写下这样的东西时:

"hello" " world" "\n"

相当于

"hello world\n"

因此,此代码中的字符串为"\p\x12\x01"

但是,我认为这是无效代码:标准C中没有\p这样的东西。它可以是扩展名,但它不是由标准定义的。 \xhh对十六进制表示有效。但请记住,您要将指向字符序列的指针(更具体地说,指向常量字符串初始化程序的指针)分配给u_int16数组,这实际上是一件奇怪的事情。除非此代码针对特定平台,或者您正在使用某些嵌入式系统或类似的东西,否则您必须小心。