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

는 \의 X12 또는 \ 피C 언어 정의는 의미

+5

@KVD 그래 맞아. Google은 무엇을 "\ p"? –

+0

특수 문자를 표현하는 "이스케이프 시퀀스"입니다.http://en.wikipedia.org/wiki/Escape_sequences_in_C –

+1

참조 이것은 C 표준에 의해 정의 된 초기화처럼 보이지 않습니다 (사용중인 C 구현에서 'u_int16'이 문자 유형이 아닌 경우). 확장자이거나 유효하지 않은 코드 일 수 있습니다. –

답변

1

표준 C에서는 \ "X12"가 갖는 문자를 포함하는 문자열을 수단 값 18 (16 진수 16 12) "\ x01"은 값이 1 인 문자가 포함 된 문자열입니다. "\p"은 표준 C 이스케이프 시퀀스가 ​​아니지만 확장이 될 수 있습니다.

표준 C에서 이와 같이 연속되는 3 개의 문자열은 하나의 문자열로 연결되고 (null 문자로 끝남) 결과 문자열을 문자 배열 (char, unsigned char 또는 signed char의 배열)을 초기화하는 데 사용할 수 있습니다.

myDeviceDescriptoru_int16의 배열로 선언됩니다. char, unsigned char 또는 signed char의 경우 별칭 (typedef을 통한 u_int16)이 아닌 경우 myDeviceDescriptor을 초기화하는 것은 C 표준에 의해 정의되지 않습니다. u_int16이 그러한 별칭 일 수는 있지만이 코드가 16 비트 바이트가있는 특수 환경 용으로 작성되지 않은 경우에는 발생하지 않습니다.

이 구문은 문자열 리터럴을 사용하여 u_int16의 배열을 초기화 할 수있는 확장 프로그램 인 C 구현의 고유 한 확장 프로그램 일 수 있습니다.

"\p"이 무엇인지와이 확장이 지원되는지 여부를 확인하려면 C 구현 또는이 코드에 대한 기타 특정 정보에 대한 설명서가 필요합니다.

또 다른 가능성은 코드가 잘못되었다는 것입니다.

1

컴파일 타임 문자열 연결을 수행 중입니다. 당신이 뭔가를 쓸 때 :

"hello" " world" "\n" 

"hello world\n" 

는 따라서,이 코드에서 당신이 가지고있는 문자열이 "\p\x12\x01"입니다 동일합니다.

그러나 이것은 잘못된 코드라고 생각합니다. 표준 C에는 \p과 같은 것이 없습니다. 확장 일 수는 있지만 표준에 의해 정의되지 않았습니다. \xhh은 16 진수 표현에 유효합니다. 그러나 문자 시퀀스 (더 구체적으로는 상수 문자열 초기화 프로그램에 대한 포인터)에 대한 포인터를 u_int16 배열에 할당한다는 것은 매우 이상한 일임을 명심하십시오. 이 코드가 특정 플랫폼을 타겟으로하지 않거나 일부 임베디드 시스템 또는 이와 유사한 작업을하는 경우가 아니면 조심해야합니다.

3

코드 스 니펫은 USB 프로토콜 구현의 일부인 것으로 보입니다. uint_16 배열은 가독성을 높이기 위해 여러 개의 작은 문자열을 연결 한 것으로 기록됩니다. 각 16 진수 값 뒤에 주석으로 작성된 의미가옵니다.

\p은 'Pascal string'을 나타냅니다. 이것은 오히려 오래된 구조체로, 모든 컴파일러에서 사용할 수있는 것은 아닙니다. -fpascal-strings이 필요합니다.

+0

Humm,'\ p'에 대해 알아 주어서 좋다. 좋은 대답, 파스칼 문자열 세부 +1. gcc는 지원하지 않습니다. –

+1

이전에는 사용되었지만'-fpascal-strings' 플래그는 더 이상 사용되지 않습니다. Intel 컴파일러는 [여전히 허용합니다] (http://software.intel.com/en-us/node/460392). – damienfrancois