it-swarm-pt.tech

":" (dois pontos) em C struct - o que isso significa?

struct _USBCHECK_FLAGS
    {
        unsigned char   DEVICE_DEFAULT_STATE       : 1;
        unsigned char   DEVICE_ADDRESS_STATE       : 1;
        unsigned char   DEVICE_CONFIGURATION_STATE : 1;
        unsigned char   DEVICE_INTERFACE_STATE     : 1;
        unsigned char   FOUR_RESERVED_BITS         : 8;
        unsigned char   RESET_BITS                 : 8;
    } State_bits;

O que :1 e :8 significar?

80
Mohamed Maged

Esses são campos de bits. Basicamente, o número após os dois pontos descreve quantos bits esse campo usa. Aqui está um citação do MSDN descrevendo os campos de bits:

A expressão constante especifica a largura do campo em bits. O especificador de tipo para o declarador deve ser int sem sinal, int assinado ou int, e a expressão constante deve ser um valor inteiro não negativo. Se o valor for zero, a declaração não possui declarador. Matrizes de campos de bits, ponteiros para campos de bits e funções que retornam campos de bits não são permitidas. O declarador opcional nomeia o campo de bit. Os campos de bits podem ser declarados apenas como parte de uma estrutura. O endereço do operador (&) não pode ser aplicado aos componentes do campo de bits.

Os campos de bits sem nome não podem ser referenciados e seu conteúdo em tempo de execução é imprevisível. Eles podem ser usados ​​como campos "fictícios", para fins de alinhamento. Um campo de bit sem nome, cuja largura é especificada como 0, garante que o armazenamento do membro que segue na lista de declaração de estrutura comece em um limite int.

Este exemplo define uma matriz bidimensional de estruturas denominada tela.

struct 
{
    unsigned short icon : 8;
    unsigned short color : 4;
    unsigned short underline : 1;
    unsigned short blink : 1;
} screen[25][80];

Editar: outro bit importante no link do MSDN:

Os campos de bits têm a mesma semântica que o tipo inteiro. Isso significa que um campo de bits é usado nas expressões exatamente da mesma maneira que uma variável do mesmo tipo base seria usada, independentemente de quantos bits existem no campo de bits.

Uma amostra rápida ilustra isso muito bem. Curiosamente, com tipos mistos, o compilador parece padronizar para sizeof (int).

  struct
  {
    int a : 4;
    int b : 13;
    int c : 1;
  } test1;

  struct
  {
    short a : 4;
    short b : 3;
  } test2;

  struct
  {
    char a : 4;
    char b : 3;
  } test3;

  struct
  {
    char a : 4;
    short b : 3;
  } test4;

  printf("test1: %d\ntest2: %d\ntest3: %d\ntest4: %d\n", sizeof(test1), sizeof(test2), sizeof(test3), sizeof(test4));

teste1: 4

teste2: 2

test3: 1

teste4: 4

62
JoeFish

Também encontrei a notação de dois pontos, mas no meu contexto os campos de bits não faziam sentido. Então eu fiz algumas escavações. Essa notação também é usada para atribuir valores - em meus indicadores de situação específicos para funções.

Fonte: http://www.tldp.org/LDP/lkmpg/2.4/html/c577.htm

Abaixo está uma amostra e um trecho para explicar.

" Existe uma extensão do gcc que torna a atribuição a essa estrutura mais conveniente . Você a verá em drivers modernos e pode pegá-lo de surpresa. Isso é a aparência da nova maneira de atribuir à estrutura: "

struct file_operations fops = {
   read: device_read,
   write: device_write,
   open: device_open,
   release: device_release
};

A maneira C99 (antiga, compatível) se parece com:

struct file_operations fops = {
   .read = device_read,
   .write = device_write,
   .open = device_open,
   .release = device_release
};
14
ykuksenko

Ele define campos de bits de largura 1 e 8.

6
zvrba