Что такое композитный тип в C?

Из §6.2.7.5 (стр. 66):

ПРИМЕР Учитывая следующие два объявления области видимости файла:

int f(int (*)(), double (*)[3]);  
int f(int (*)(char *), double (*)[]);  

Результирующий составной тип для функции:

int f(int (*)(char *), double (*)[3]);

В приведенном выше примере они объясняют, что составной тип является типом, совместимым с двумя разными типами. Я бы интуитивно понял фразу "составной тип" как означающую "структуры и союзы", который, кажется, находится вне цели.

Что такое составной тип в C и для чего он используется? Может кто-нибудь, пожалуйста, подробно объясните приведенный выше пример?

Ответ 1

Я бы интуитивно понял фразу "составной тип" как смысл "структуры и союзы", который, кажется, находится вне цели.

В определении языка C массивы и структуры представляют собой совокупные типы (типы, состоящие из нескольких элементов). Союзы - свое собственное животное, так как они могут принимать только значение одного элемента за раз.

Сложные типы - большая проблема для разработчиков компилятора, а не для обезьян, запускаемых из-за мельницы. Мы с вами не будем пытаться определить составной тип или объявить объекты этого типа.

В приведенном примере у вас есть две объявления области видимости для функции f, которые немного отличаются друг от друга. Основываясь на правилах, представленных в 6.2.7/3, компилятор определяет тип, который работает для обоих, так что он может принудительно вводить семантику типа во время компиляции (т.е. Любые вызовы f могут быть проверены надлежащим образом, даже при незначительном различные декларации) и генерировать правильный машинный код для вызова функции.

Ответ 2

Я, вероятно, не тот человек, который мог бы ответить на это, но для чего это стоит, вот в чем причина C99, которая может быть полезна:

6.2.7 Совместимый тип и составной тип

Были введены понятия совместимого типа и составного типа, чтобы позволить C89 обсуждать эти ситуации, в которых объявления типов не обязательно должны быть идентичными. Эти термины особенно полезны для объяснения взаимосвязи между неполный тип и завершенный тип. С добавлением переменной (§6.7.5.2) на C99, была расширена совместимость типа массива так что массивы переменной длины совместимы как с массивом известный постоянный размер и массив с неполным типом.

Объявления структуры, объединения или перечисления в двух разных единицы перевода не формально объявляют один и тот же тип, даже если текст этих объявлений поступает из одного и того же заголовочного файла, поскольку единицы перевода сами по себе не пересекаются. Таким образом, Стандарт определяет дополнительные правила совместимости для таких типов, чтобы два такие объявления совместимы, если они достаточно схожи.

ТИХИЙ ИЗМЕНЕНИЕ В C99

Структуры или объявления типа объединения в разных единицах перевода теперь должны иметь идентичные теги для совместимости.