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 char
existirá, 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 ( case
ró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.