2016-10-13 40 views
0

道歉,如果這是一個基本問題,但我在struct的定義中第一次看到這些冒號(:)。這些冒號做什麼?C/C++ - uint8_t x中冒號的作用是什麼x:6

struct gsm48_meas_res { 
    uint8_t rxlev_full:6, 
     dtx_used:1, 
     ba_used:1; 
    uint8_t rxlev_sub:6, 
     meas_valid:1, 
     spare:1; 
    uint8_t no_nc_n_hi:1, 
     rxqual_sub:3, 
     rxqual_full:3, 
     spare2:1; 
    uint8_t rxlev_nc1:6, 
     no_nc_n_lo:2; 
    uint8_t bsic_nc1_hi:3, 
     bcch_f_nc1:5; 
    uint8_t rxlev_nc2_hi:5, 
     bsic_nc1_lo:3; 
    uint8_t bsic_nc2_hi:2, 
     bcch_f_nc2:5, 
     rxlev_nc2_lo:1; 
    uint8_t rxlev_nc3_hi:4, 
     bsic_nc2_lo:4; 
    uint8_t bsic_nc3_hi:1, 
     bcch_f_nc3:5, 
     rxlev_nc3_lo:2; 
    uint8_t rxlev_nc4_hi:3, 
     bsic_nc3_lo:5; 
    uint8_t bcch_f_nc4:5, 
     rxlev_nc4_lo:3; 
    uint8_t rxlev_nc5_hi:2, 
     bsic_nc4:6; 
    uint8_t bcch_f_nc5_hi:4, 
     rxlev_nc5_lo:4; 
    uint8_t rxlev_nc6_hi:1, 
     bsic_nc5:6, 
     bcch_f_nc5_lo:1; 
    uint8_t bcch_f_nc6_hi:3, 
     rxlev_nc6_lo:5; 
    uint8_t bsic_nc6:6, 
     bcch_f_nc6_lo:2; 
} __attribute__ ((packed)); 

我面對這些uint8_t變量值賦給一些問題。起初,我認爲這是默認的任務,但在耗盡了所有其他可能性之後,我認爲它與這些冒號有關。

回答

2

這是一個比特場,這是一個非常糟糕的標準監管。例如

uint8_t rxlev_full:6, 
     dtx_used:1, 
     ba_used:1; 

的意思是「在存儲器中的某個地方,給我6位,然後1位然後1個比特」。您無法輕易地知道或承擔位順序 - 它是特定於編譯器的。另外,僅爲_Bool,signed intunsigned int定義標準位字段。使用uint8_t是非標準擴展。

所以不知道這段代碼實際上會做什麼。你必須閱讀你的編譯器手冊來了解具體細節。