2014-09-08 3 views
0

저는 임베디드 시스템 프로그래밍을 시작한 초보자이며 다른 사람의 코드로 작업하고 있습니다. 그러나 이해하는데 도움이되지 않는 구조체 정의가 있습니다.C struct를 이해하는 데 도움이 필요합니다

struct PACKED { 
     uint8_t cmd; 
     uint8_t int_status; 
     uint8_t v[14]; 
    } rx, tx = { cmd : REG_ADDRES | 0x80, }; 

cmd : REG_ADDRES | 0x80, 라인을 이해하는 데 도움이 되었으면합니다.

미리 감사드립니다. tx = { cmd : REG_ADDRES | 0x80, };가 수행되는 라인은 입력 그 제 1 가변 PACKEDtx라는 객체를 초기화하는 것이 무엇

+2

C 방식'선언 struct' 객체와 초기화하는 것입니다. IMHO는 피해야합니다. – 101010

+0

예,하지만 초기화하는 방식을 이해하지 못합니다. – Eneko

+1

C++ (및 C에서도)에서이 구문을 사용하는 것은 컴파일러 * 확장 *입니다. 이는 멤버 별 초기화의 표준 방식이 아닙니다. C++에는 멤버 초기화 (memberwise initialization)조차 없다. 또한'tx' 변수 만 초기화되고'rx' 변수는 초기화되지 않습니다. –

답변

4
구조체 타입 정의를 결합

, 그 유형의 두 변수의 정의 : 코드에서

, 그것과 동일하다. 코드는 아래 C 지정된 초기화 구문 사용 고정 제외 그래서, 다음 코드와 같다 : 전체 tx 상기 초기화된다

struct PACKED { 
     uint8_t cmd; 
     uint8_t int_status; 
     uint8_t v[14]; 
}; 

struct PACKED rx; // uninitialized, do not use until initialized elsewhere 
struct PACKED tx = { .cmd = REG_ADDRES | 0x80 }; // cmd field initialized with value 

참고 명시 값이 제공되지 않은 필드는 0

로 초기화

그리고 당신은 무엇을 REG_ADDRES | 0x80 의미하는 것은, 간단 정수 표현, 비트 OR을 사용하여 계산 궁금해, 그래서 하나의 비트 수 (7)을 설정하고, 그들이 있기 때문에 REG_ADDRES에서 0..6 다른 비트를 취합니다.

+1

'PACKED'는 구조체가 포장 된 구조가되도록 매크로라고 생각합니다. – glglgl

+1

부수적으로 "명시 적 값이 제공되지 않은 필드는 0으로 초기화됩니다"는 컴파일러와 최적화 옵션에 따라 달라질 수 있습니다. 좋은 대답은 :) –

+0

@glglgl 흠, 꽤 가능합니다. 확실히 말이 될 것입니다. – hyde

2

(즉 uint8_t cmd)는 (비트 단위 OR REG_ADDRES0x80이다) 값 REG_ADDRES | 0x80로 초기화 받고있다.

struct PACKED 
{ 
    uint8_t cmd; 
    uint8_t int_status; 
    uint8_t v[14]; 
}; 

main() 
{ 
    struct PACKED tx; 
    tx.cmd = REG_ADDRES | 0x80; 
} 
+0

''PACKED'는 구조체가 이름이 아닌 구조체를 만드는 매크로라고 생각합니다. – glglgl

+0

@glglgl 그런 경우 PACKED 매크로의 정의가 있어야합니다. 또한, 다른 방식으로 사용해야합니다! – CinCout

2

본질적으로이 부분은이 변수의 내용을 정의합니다.

이것은 사용하는 컴파일러의 확장입니다. C99은 약간 다른 방식으로이를 정의합니다. 그것이 정말로 단지 tx이 init'ed 것을 건너 뛸 wasy이기 때문에 거기 당신은, 일을 선언하는이 방법은 그러나, 매우 위험하다

struct PACKED { 
    uint8_t cmd; 
    uint8_t int_status; 
    uint8_t v[14]; 
} rx, tx = { .cmd = REG_ADDRES | 0x80 }; 

를 작성합니다.

더 좋은 방법은

// first declare the struct as a type 
struct PACKED uart { 
    uint8_t cmd; 
    uint8_t int_status; 
    uint8_t v[14]; 
}; 
struct PACKED uart rx; 
struct PACKED uart tx = { .cmd = REG_ADDRES | 0x80 }; 
관련 문제