const u_int16 myDeviceDescriptor [] = "\p"
"\x12" // Length
"\x01" // Type (Device Descriptor)
意味着什麼,\ X12或\ pC語言定義是指
const u_int16 myDeviceDescriptor [] = "\p"
"\x12" // Length
"\x01" // Type (Device Descriptor)
意味着什麼,\ X12或\ pC語言定義是指
在標準C, 「\ X12」 是指含有一個字符具有字符串值18(十六進制12 ) ,「\ x01」是一個字符串,其中包含一個值爲1的字符。"\p"
不是標準的C轉義序列,但它可能是一個擴展。
在標準C中,像這樣的三個連續字符串被連接成一個字符串(並以空字符結尾)。結果字符串可用於初始化字符數組(數組char
,unsigned char
或signed char
)。
myDeviceDescriptor
被聲明爲u_int16
的數組。除非u_int16
是char
,unsigned char
或signed char
的別名(通過typedef
),那麼用此字符串初始化myDeviceDescriptor
並不是由C標準定義的。儘管u_int16
可能是這樣的別名,但除非此代碼是爲16位字節的特殊環境編寫的,否則不太可能。
該語法可能是特定於其實現C實現的擴展,它允許用字符串初始化u_int16
數組。
您需要C實現的文檔或關於此代碼的其他特定信息來確定"\p"
是什麼以及是否支持此擴展。
另一種可能性是代碼錯誤。
它正在編譯時串連接。當你寫類似:
"hello" " world" "\n"
它相當於
"hello world\n"
因此,在這個代碼,你有串"\p\x12\x01"
。
但是,我認爲這是無效的代碼:標準C中沒有\p
這樣的東西。它可以是擴展名,但它不是由標準定義的。 \xhh
適用於十六進制表示。但請記住,您將一個指向字符序列的指針(更具體地說是指向常量字符串初始值設定項的指針)賦給u_int16
數組,這確實是一件很奇怪的事情。除非這個代碼是針對特定的平臺,或者你正在研究一些嵌入式系統或類似的東西,否則你必須小心。
您的代碼片段似乎是USB協議實現的一部分。 uint_16
數組被寫爲幾個小字符串的連接以簡化可讀性。每個十六進制值的後面跟着它的含義寫成註釋。
\p
表示'Pascal string'。這是一個相當古老的構造,不適用於所有編譯器。它需要-fpascal-strings
。
Humm,很高興知道'\ p'。好的答案,Pascal字符串細節+1。儘管gcc似乎不支持它。 –
它曾經用過,但'-fpascal-strings'標誌已被棄用。英特爾編譯器[仍然允許它](http://software.intel.com/zh-cn/node/460392)。 – damienfrancois
@KVD是的沒錯。谷歌爲什麼,「\ P」? –
這些是「轉義序列」,一種表達特殊字符的方式。見http://en.wikipedia.org/wiki/Escape_sequences_in_C –
這看起來不像C標準定義的初始化(除非在C實現中使用'u_int16'是一個字符類型)。它可能是一個擴展,或者它可能是無效的代碼。 –