Может ли псевдоним структуры иметь свой собственный начальный и единственный член?
Например, допустим ли этот код или он вызывает неопределенное поведение, нарушая правила псевдонимов?
int x;
struct s { int i; } y;
x = 1;
y = *(struct s *)&x;
printf("%d\n", y.i);
Меня интересует использование основанной на этом методики для разработки переносимого метода для выполнения операций чтения с псевдонимом.
Обновление: вот предполагаемый вариант использования, немного отличающийся, но он должен быть действительным, если и только если вышеупомянутое допустимо:
static inline uint32_t read32(const unsigned char *p)
{
struct a { char r[4]; };
union b { struct a r; uint32_t x; } tmp;
tmp.r = *(struct a *)p;
return tmp.x;
}
GCC, по желанию, компилирует это в одну 32-битную загрузку, и, похоже, избегает проблем с наложением, которые могут произойти, еслиp
на самом деле указывает на тип, отличный отchar
, Другими словами, кажется, что он выступает в качестве переносной замены для GNU C__attribute__((__may_alias__))
приписывать. Но я'Я не уверен, что этодействительно четко определены