«Популярное расширение», которое может быть сконфигурировано для поддержки большинства реализаций (если они не всегда делают это), состоит в том, чтобы разрешить преобразование адреса типа структуры в адрес другого, который имеет общую начальную последовательность, ииспользоваться для доступа к членам этой последовательности до тех пор, пока структура не будет доступна с помощью средств, отличных от преобразованного указателя, или пока выполнение не войдет в функцию или цикл, в котором это произойдет.
В реализациях, которые поддерживают это расширение, запрошенная семантикаможет быть достигнуто путем объявления структуры, макет которой соответствует структуре структуры, с элементом Flexible Array.Например:
struct POINT { int x, y; };
struct POLYGON { int sides; struct POINT coords[]; };
struct TRIANGLE { int sides; struct POINT coords[3]; };
void draw_polygon(struct POLYGON const *p);
void test(void)
{
struct TRIANGLE my_triangle = {3, {{1,2}, {3,4], {5,6}};
draw_polygon((struct POLYGON*)&my_triangle);
}
Некоторые компиляторы, такие как icc и MSVC, достаточно продвинуты, чтобы поддерживать это расширение, даже если включен псевдоним на основе типа.Другие, такие как gcc и clang, могут поддерживать это расширение только с помощью опции -fno-strict-aliasing
.
Хотя код, использующий это расширение, не совсем соответствует, Комитет по стандартам заявил в опубликованном Обосновании, что они не хотятсделать язык доступным только для написания переносимых программ.Вместо этого они ожидали, что качественные реализации будут поддерживать различные «популярные расширения», обрабатывая некоторые конструкции способами, которые будут полезны для их клиентов, даже если стандарт позволит им поступить иначе.Способность конвертировать указатели между типами структур была фундаментальной частью языка, который Стандарт был описан для описания с 1974 года, и почти все реализации могут быть сконфигурированы для его поддержки.Таким образом, код, подобный приведенному выше, должен распознаваться как более переносимый, чем код, использующий нестандартные синтаксические расширения для достижения аналогичной семантики.