Tem vários problemas:
uint32_t não é garantido que exista
"ABCD", não é garantido que um array decadente para char*(C) / char const*(C ++) esteja alinhado adequadamente uint32_t*. Se não for, o elenco é UB
- se o elenco passou, o deref (
*(uint32_t*)"ABCD") é uma violação estrita de alias (UB)
Você pode simplesmente fazer algo assim:
#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á, pode alternar entre qualquer coisa e possui requisitos mínimos de alinhamento.)
Todas as macros, incluindo suas tentativas, têm a desvantagem de serem inadequadas para condicionais de pré-processador ( #if ...) ou em contextos em que é necessária uma expressão constante inteira ( caserótulos, tamanhos de matriz, tamanhos de campo de bits), mas, quando usados em outros lugares, os compiladores modernos geralmente tratam o problema. resultado como uma constante de tempo de compilação no que diz respeito à saída otimizada da montagem.