const u_int16 myDeviceDescriptor [] = "\p"
"\x12" // Length
"\x01" // Type (Device Descriptor)
意思是什么,\ x12或\ p
答案 0 :(得分:3)
您的代码段似乎是USB协议实现的一部分。 uint_16
数组被写为几个小字符串的串联,以方便可读性。每个十六进制值后跟其含义写为注释。
\p
表示“Pascal string”。它是一个相当古老的结构,并非在所有编译器上都可用。它需要-fpascal-strings
。
答案 1 :(得分:1)
在标准C中,“\ x12”表示包含值为18的字符的字符串(十六进制12 16 ),“\ x01”是包含值为1的字符的字符串。{{ 1}}不是标准的C转义序列,但它可以是扩展名。
在标准C中,像这样的三个连续字符串被连接成一个字符串(并以空字符结尾)。生成的字符串可用于初始化字符数组("\p"
,char
或unsigned char
数组。
signed char
被声明为myDeviceDescriptor
的数组。除非u_int16
是u_int16
,typedef
或char
的别名(通过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
数组,这实际上是一件奇怪的事情。除非此代码针对特定平台,或者您正在使用某些嵌入式系统或类似的东西,否则您必须小心。