2013-11-21 144 views
1
const u_int16 myDeviceDescriptor [] = "\p" 
"\x12" // Length 
"\x01" // Type (Device Descriptor) 

意味着什麼,\ X12或\ pC語言定義是指

+5

@KVD是的沒錯。谷歌爲什麼,「\ P」? –

+0

這些是「轉義序列」,一種表達特殊字符的方式。見http://en.wikipedia.org/wiki/Escape_sequences_in_C –

+1

這看起來不像C標準定義的初始化(除非在C實現中使用'u_int16'是一個字符類型)。它可能是一個擴展,或者它可能是無效的代碼。 –

回答

1

在標準C, 「\ X12」 是指含有一個字符具有字符串值18(十六進制12 ) ,「\ x01」是一個字符串,其中包含一個值爲1的字符。"\p"不是標準的C轉義序列,但它可能是一個擴展。

在標準C中,像這樣的三個連續字符串被連接成一個字符串(並以空字符結尾)。結果字符串可用於初始化字符數組(數組char,unsigned charsigned char)。

myDeviceDescriptor被聲明爲u_int16的數組。除非u_int16char,unsigned charsigned char的別名(通過typedef),那麼用此字符串初始化myDeviceDescriptor並不是由C標準定義的。儘管u_int16可能是這樣的別名,但除非此代碼是爲16位字節的特殊環境編寫的,否則不太可能。

該語法可能是特定於其實現C實現的擴展,它允許用字符串初始化u_int16數組。

您需要C實現的文檔或關於此代碼的其他特定信息來確定"\p"是什麼以及是否支持此擴展。

另一種可能性是代碼錯誤。

1

它正在編譯時串連接。當你寫類似:

"hello" " world" "\n" 

它相當於

"hello world\n" 

因此,在這個代碼,你有串"\p\x12\x01"

但是,我認爲這是無效的代碼:標準C中沒有\p這樣的東西。它可以是擴展名,但它不是由標準定義的。 \xhh適用於十六進制表示。但請記住,您將一個指向字符序列的指針(更具體地說是指向常量字符串初始值設定項的指針)賦給u_int16數組,這確實是一件很奇怪的事情。除非這個代碼是針對特定的平臺,或者你正在研究一些嵌入式系統或類似的東西,否則你必須小心。

3

您的代碼片段似乎是USB協議實現的一部分。 uint_16數組被寫爲幾個小字符串的連接以簡化可讀性。每個十六進制值的後面跟着它的含義寫成註釋。

\p表示'Pascal string'。這是一個相當古老的構造,不適用於所有編譯器。它需要-fpascal-strings

+0

Humm,很高興知道'\ p'。好的答案,Pascal字符串細節+1。儘管gcc似乎不支持它。 –

+1

它曾經用過,但'-fpascal-strings'標誌已被棄用。英特爾編譯器[仍然允許它](http://software.intel.com/zh-cn/node/460392)。 – damienfrancois