Ik ben een beetje aan het rommelen met EmBlocks en een Stm32.
Loop daarbij tegen een vraagje aan.
Hoe kan je er nu voor zorgen dat bijvoorbeeld Crc32 alleen gebruikt kan/mag worden bij hdb1.ErrorDetection en niet bij hdb1.Databytes.


int main(void)
{
headerbyte1 hdb1;

hdb1.ErrorDetection = Crc32;
hdb1.DataBytes = 2;
.
.
.
.
{


typedef enum
{ Crc8 = 0x03,
  Crc16 =0x04,
  Crc32 =0x05
}ErrorDetection_EnumDef;

typedef enum
{ Data = 0x00,
  Command =0x01
}CommandMode_EnumDef;

typedef struct
{
    uint8_t DataBytes:4;            
    uint8_t ErrorDetection:3 ;         
    uint8_t CommandMode:1;         
} headerbyte1;

Kan en mag overal gebruikt worden. Of dat gebeurt maak je zelf uit in je programma...

Er zijn geen overlappende waarden, dus je kan gewoon met een switch statement kijken of het argument geldig is.

Als je de variabele errorDetection in je struct van het typeErrorDetection_EnumDef maakt ipv uint8, zou je compiler een warning moeten geven. Ik bedenkt me wel net dat je dataBytes dan nog steeds de waarde van een andere enum toe kan kennen zonder een warning. Enkel als deze zelf ook weer een enum zou zijn gaat dat.
Ik weet niet of het helemaal goed gaat als je die bitvelden zo definieert voor als je die variabele van type ErrorDetection_EnumDef maakt

Als ik je vraag goed begrijp zou je willen dat

hdb1.ErrorDetection = Crc32;

werkt, maar dat


int i;
...
i = Crc32;

een foutmelding geeft of een waarschuwing.

Helaas, kan dat niet. Een voorbeeldje zou zijn:


typedef struct
{
    uint8_t command;            
    uint8_t subcommand;         
    uint8_t CommandMode;         
} header;

// subcommands for the calculate CRC comnand
typedef enum { Crc8, Crc16, Crc32 } ErrorDetection_EnumDef;
// subcommands for the arithmetic
typedef enum { DO_ADD, DO_SUBTRACT, DO_MULTIPLY } Arithmetic_EnumDef;

De compiler MOET nu toestaan dat je beide enum-waardes aan voor hem dezelfde variable toewijst.

Of je een enum DECLARATIE ook in een bitfield ding kan gebruiken weet ik niet:


typedef struct
{
    uint8_t DataBytes:4;            
    ErrorDetection_EnumDef ErrorDetection:3 ;         
    uint8_t CommandMode;         
} headerbyte1;

Dit zou je WEL al wat "hulpmiddelen" opleveren zoals dat als je


switch (hdb1.ErrorDetection) {
  case Crc16:... break;
  case Crc32:... break;
}

het geval voor Crc8 vergeet dat je dan een waarschuwing krijgt.