이 작업은 Arduino에서 I2C로 STM32로 데이터를 전송하는 것입니다.C와 C++에서 열거 형을 가진 구조체가 다른 이유는 무엇입니까?
내가 같은 가지고 다른 측면에서enum PhaseCommands {
PHASE_COMMAND_TIMESYNC = 0x01,
PHASE_COMMAND_SETPOWER = 0x02,
PHASE_COMMAND_CALIBRATE = 0x03
};
enum PhaseTargets {
PHASE_CONTROLLER = 0x01,
// RESERVED = 0x02,
PHASE_LOAD1 = 0x03,
PHASE_LOAD2 = 0x04
};
struct saatProtoExec {
PhaseTargets target;
PhaseCommands commandName;
uint32_t commandBody;
} phaseCommand;
uint8_t phaseCommandBufferSize = sizeof(phaseCommand);
phaseCommand.target = PHASE_LOAD1;
phaseCommand.commandName = PHASE_COMMAND_SETPOWER;
phaseCommand.commandBody = (uint32_t)50;
는 C를 사용하여 정의 :
그래서 나는 구조체와 열거 형은 C++을 사용하여 아두 이노에 정의있어typedef enum {
COMMAND_TIMESYNC = 0x01,
COMMAND_SETPOWER = 0x02,
COMMAND_CALIBRATE = 0x03
} MasterCommands;
typedef enum {
CONTROLLER = 0x01,
// RESERVED = 0x02,
LOAD1 = 0x03,
LOAD2 = 0x04
} Targets;
struct saatProtoExec {
Targets target;
MasterCommands commandName;
uint32_t commandBody;
} execCommand;
uint8_t execBufferSize = sizeof(execCommand);
execCommand.target = LOAD1;
execCommand.commandName = COMMAND_SETPOWER;
execCommand.commandBody = 50;
을 그리고 난이 구조체 비교 바이트 - 바이트 단위 :
=====================
BYTE | C++ | C
=====================
Byte 0 -> 0x3 -> 0x3
Byte 1 -> 0x0 -> 0x2
Byte 2 -> 0x2 -> 0x0
Byte 3 -> 0x0 -> 0x0
Byte 4 -> 0x32 -> 0x32
Byte 5 -> 0x0 -> 0x0
Byte 6 -> 0x0 -> 0x0
Byte 7 -> 0x0 -> 0x0
왜 바이트 1과 2가 다른가요?
나는 열거 크기 + 패딩을 말하고 싶지만 ... –
동일한 컴파일러가 같은 플래그로 사용됩니까? 두 표준 모두 열거 형이라면 크기에 대해서는 아무 것도 말하지 않으므로 서로 다른 것을 허용합니다. 여전히 한 컴파일러에서 동일해야합니다. –
@NorbertLange 아니요, 컴파일러가 다릅니다. 하나는 Arduino 네이티브이고, 두 번째는 KEK MDK-ARM입니다. – Bulkin