Tiene varios problemas:
uint32_t no se garantiza que exista
"ABCD", no se garantiza que una matriz en descomposición a char*(C) / char const*(C ++) esté alineada adecuadamente uint32_t*. Si no es así, el elenco es UB
- si el reparto pasó, el deref (
*(uint32_t*)"ABCD") es una violación de alias estricta (UB)
Es posible que desee hacer algo como esto en su lugar:
#if !__cplusplus
#define LITTLE_ENDIAN_EH() (*(char*)&(int){1});
#else
//C++ doesn't have compound literals
static int const LITTLE_ENDIAN_EH_ = 1;
#define LITTLE_ENDIAN_EH() (*(char*)&LITTLE_ENDIAN_EH_)
#endif
(Funciona porque charexistirá, puede alias cualquier cosa y tiene requisitos mínimos de alineación).
Todas las macros, incluidos sus intentos, tienen la desventaja de ser inadecuadas para los condicionales del preprocesador ( #if ...) o en contextos donde se requiere una expresión constante entera ( caseetiquetas, tamaños de matriz, tamaños de campo de bits), pero cuando se usan en otros lugares, los compiladores modernos generalmente tratan el resultado como una constante de tiempo de compilación en lo que respecta a la salida de ensamblaje optimizada