Ваш пример очень близок к созданию двух структур совместимого типа (C11 6.2.7). Но чтобы быть совместимыми, они должны иметь одинаковых членов с одинаковыми именами, а теги struct также должны быть одинаковыми.
У вас этого нет, поэтому (TL; DR) структуры в вопросе не могут быть псевдонимами.
Еще одна вещь, с которой можно поиграться, - это трюк, называемый common начальная последовательность (C11 6.5.2.3), где вы можете поместить обе структуры в объединение, которое видно в блоке перевода. После этого вам будет разрешено проверять первую последовательность членов каждого типа структуры, пока они не перестанут быть совместимыми. Вы можете сделать это:
typedef union
{
struct hello h;
struct world w;
} hack_t;
Затем получить доступ к отдельным членам любой структуры. К сожалению, это правило немного exoti c, и компиляторы, очевидно, не всегда хорошо его поддерживают - правило подчинялось некоторым отчетам о дефектах (DR). Я не уверен в его статусе в текущем C17.
Но независимо от этого трюка, объединение все еще позволяет присвоить доступ к struct hello
или struct world
через hack_t
, так как тип объединения, который включает совместимый тип среди своих членов (C11 6.5 / 7). Полагаю, что это немного полезно.
Помимо этих случаев, вы не можете дико приводить типы указателей от одного типа указателя к другому и отменять ссылки. Было бы строгое нарушение псевдонимов (C11 6.5 / 7), даже если все отдельные члены являются совместимыми типами. (Однако, конечно, вы можете получить доступ к любому отдельному члену float
, сняв ссылку на указатель float
на этого члена.)
Ваша оптимизация restrict
не применяется, поскольку структуры не могут иметь псевдоним, если только они действительно совместимые типы. Таким образом, компилятор будет предполагать, что они всегда находятся в разных областях памяти.
Неважно, используете ли вы float
или любой другой примитивный тип данных, они все ведут себя одинаково, за исключением типов символов. Указатель на тип символа может использоваться для доступа к любым данным без строгого нарушения псевдонимов (но не наоборот, чтение типа символа через другой несовместимый тип).