Предположительно, вы имеете в виду некий typedef
, который позволил бы вам сказать: «Цвет такой же, как у вектора, но с именами x
, y
и z
, измененными на r
, g
и b
соответственно "?
Если это так, то ответ отрицательный, C не дает этого (и я не могу придумать ничего, что он предоставил бы, который был бы достаточно близким заменителем).
Редактировать: вы можете, однако, заставить функцию работать с любой из них довольно легко:
typedef union {
Color c;
Vector v;
} cv;
int my_func(cv *value);
C гарантирует, что начальная последовательность элементов с одинаковыми типами в одном и том же порядке (который в данном случае является всеми из них) может обрабатываться одинаково с помощью любого селектора. Другими словами, если вы вставите Vector
в свой cv
и передадите его функции, функция может работать с этими тремя элементами: r
, g
и b
или x
, y
и z
без проблем (например, при записи в g
это изменит y
, если вы просматриваете его как Vector
вместо Color
).
Редактировать: C99, §6.5.2.3 / 5:
Одна специальная гарантия предоставляется для упрощения использования объединений: если объединение содержит несколько структур, которые имеют общую начальную последовательность (см. Ниже), и если объект объединения в настоящее время содержит одну из этих структур, разрешается Осмотрите общую начальную часть любого из них где угодно, чтобы было видно объявление полного типа объединения. Две структуры имеют общую начальную последовательность, если соответствующие элементы имеют совместимые типы (и для битовых полей одинаковой ширины) для последовательности из одного или нескольких начальных элементов.
В этом случае все члены c
и v
имеют одинаковые типы в одном и том же порядке, поэтому это правило применяется ко всему члену. Перечитывая вещи, однако, это только позволяет вам «проверять» общую начальную последовательность, которая, вероятно, не включает в себя запись в нее (хотя мне трудно представить, как вы могли бы сделать чтение из любого члена, не заставляя писать работу как хорошо).