Анонимные структуры в C найдены в ядре Unix - PullRequest
9 голосов
/ 07 октября 2010

Я начал читать комментарий Льва на Unix v6. Я наткнулся на эти фрагменты, которые я никогда не видел в языке Си. Автор дает какое-то объяснение, но может ли кто-нибудь объяснить мне, что здесь происходит?

params.h:

SW 0177570
...... 
struct { int integ; };

и это используется в unix/prf.c

if(SW->integ == 0)

Объяснение автора

SW предварительно определено как значение 0177570. Это адрес ядра регистр процессора только для чтения, в котором хранится настройка регистра переключателя консоли. Смысл утверждения ясен: получить содержимое в месте 0177570 и посмотреть, если они ноль. Проблема заключается в том, чтобы выразить это в C. Код if (SW == 0) не передал бы это значение. очевидно SW - значение указателя, которое должно быть разыменовываются. Компилятор мог быть изменил принять if (SW-> == 0) но в нынешнем виде это синтаксически неверно. Изобретая фиктивную структуру, с элемент integ, программист нашел удовлетворительное решение его проблема.

Мой вопрос, в основном, как это работает? Когда компилятор видит SW->integ, как он связывает SW с анонимной структурой?

1 Ответ

6 голосов
/ 07 октября 2010

IIRC, древние компиляторы C хранили все имена полей (например, integ) в одном пространстве имен вместо создания пространства имен для типа struct.Они также не различали указатели struct и указатели int, поэтому каждый указатель имеет поле integ, соответствующее его первым sizeof(int) байтам.Поскольку integ является первым значением в struct и имеет тип int, SW->integ соответствует *((int *)SW).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...