Поле типа
Поле типа элемента таблицы имен содержит информацию о базовом и производных типах соответствующего имени. Компилятор языка C заполняет эти поля только при указании опции -g. Производных типов может быть несколько, но каждое имя имеет ровно один базовый тип. Формат 16-битного поля типа таков:
d6 | d5 | d4 | d3 | d2 | d1 | базовый тип |
Биты с 0-го по 3-й кодируют базовый тип:
Обозначение | Значение | Базовый тип |
T_NULL | 0 | Тип не назначен |
T_VOID | 1 | Пустой тип |
T_CHAR | 2 | Символ |
T_SHORT | 3 | Короткое целое |
T_INT | 4 | Целое |
T_LONG | 5 | Длинное целое |
T_FLOAT | 6 | Вещественное одинарной точности |
T_DOUBLE | 7 | Вещественное двойной точности |
T_STRUCT | 8 | Структура |
T_UNION | 9 | Объединение |
T_ENUM | 10 | Перечисление |
T_MOE | 11 | Элемент перечисления |
T_UCHAR | 12 | Символ без знака |
T_USHORT | 13 | Короткое целое без знака |
T_UINT | 14 | Целое без знака |
T_ULONG | 15 | Длинное целое без знака |
Биты с 4-го по 15-й разделены на шесть двухбитных полей, обозначаемых d1..d6. Эти поля представляют уровни производных типов, перечисленых ниже:
Обозначение | Значение | Производный тип |
DT_NON | 0 | Производный тип отсутствует |
DT_PTR | 1 | Указатель |
DT_FCN | 2 | Функция |
DT_ARY | 3 | Массив |
В следующих примерах иллюстрируется представление типа в элементе таблицы имен.
char *func();
Здесь func есть имя функции, возвращающей указатель на символ. Базовый тип имени func есть 2 (символ), в поле d1 будет помещено число 2 (функция), а в поле d2 - 1 (указатель). Таким образом, в поле типа элемента func будет находиться шестнадцатеричное значение 0x62, которое и интерпретируется как функция, возвращающая указатель на символ.
short *tabptr [10] [25] [3];
Здесь tabptr есть трехмерный массив указателей на короткие целые. Базовый тип для tabptr есть 3 (короткое целое); в каждое из полей d1, d2, d3 будет помещено число 3 (массив), а в поле d4 - 1 (указатель). Таким образом, для трехмерного массива указателей на короткие целые в поле типа соответствующего элемента таблицы имен будет храниться шестнадцатеричное значение 0xff3.