LINUX.ORG.RU

История изменений

Исправление alx777, (текущая версия) :

А можно пример проблемы?

typedef enum {
  CMD_1=1,
  CMD_2=2,
  CMD_3=3
} CMD_t;

Видя только исходники, нельзя заранее сказать, что покажет sizeof(CMD_t), придется смотреть используемые опции компилятора (которые еще найти надо)

См. также тут

Тут, например, непонятно, как будет выравнен param_a. Это может быть медленнее или вообще запрещено на некоторых платформах

typedef struct {
  CMD_t     cmd;
  uint8_t   param_a;
  uint32_t  param_b;
} attribute((packed)) my_cmd_struct_t;

С эндианностью тоже возникают вопросы из-за неизвестного размера - какое значение должно быть у CMD_1 после конвертации - 0x1000000 или 0x0100 ?

По-моему, использование enum’ов для работы с железом - это лишний источник проблем, которых и так хватает в случае кросс-платформы

Вероятно, актуальные версии компиляторов справляются с этим, но к сожалению не всегда есть возможность ими воспользоваться

Исходная версия alx777, :

А можно пример проблемы?

typedef enum {
  CMD_1=1,
  CMD_2=2,
  CMD_3=3
} CMD_t;

Видя только исходники, нельзя заранее сказать, что покажет sizeof(CMD_t), придется смотреть используемые опции компилятора (которые еще найти надо)

См. также тут

Тут, например, непонятно, как будет выравнен param_a. Это может быть медленнее или вообще запрещено на некоторых платформах

typedef struct {
  CMD_t     cmd;
  uint8_t   param_a;
  uint32_t  param_b;
} attribute((packed)) my_cmd_struct_t;

С эндианностью тоже возникают вопросы из-за неизвестного размера - какое значение должно быть у CMD_1 после конвертации - 0x1000000 или 0x0100 ?

По-моемому, использование enum’ов для работы с железом - это лишний источник проблем, которых и так хватает в случае кросс-платформы

Вероятно, актуальные версии компиляторов справляются с этим, но к сожалению не всегда есть возможность ими воспользоваться