Структура, которая явно не определяет экземпляры в Unix v6 - PullRequest
5 голосов
/ 29 августа 2010

Я перебираю код Unix версии 6 с книгой Льва.Один из заголовочных файлов (param.h, к которому можно получить доступ здесь ) определяет следующие структуры:

/*struct to access integers*/

/*single integer */
struct { int integ; };

/*in bytes*/
struct { char lobyte; char hibyte; };

Эти структуры, похоже, не определяют ни один экземпляр, и при этом они не называютсяпоэтому они могут быть использованы позже.Кто-нибудь знает, для чего они нужны?

Спасибо

Ответы [ 2 ]

5 голосов
/ 29 августа 2010

Если кто-то включит весь файл в декларацию объединения, это позволит ему получить доступ к различным частям.

Это было бы что-то вроде:


  union{
   #include <param.h>
  } myparam;

  myparam.integ = 0xDEAD;
  assert(myparam.lobyte == 0xAD)
  assert(myparam.hibyte == 0xDE)

(зависит от порядкового номера архитектуры ...)

Итак, немного оглянувшись, кажется, что в старых версиях C вам не нужно было объявлять объединение; было только одно пространство имен для всех членов структуры / объединения, которые просто переводились в байтовое смещение, которое можно было использовать с любой переменной. Лучшее упоминание об этом я мог найти здесь: http://docs.sun.com/source/806-3567/compat.html Описание до ISO Sun C:

Позволяет структурам, объединениям и арифметическим типам использовать операторы выбора членов ('.', '->') для работы с членами других структур или объединений.
1 голос
/ 25 сентября 2010

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

int x;

x.lobyte = 1;
x.hibyte = 2;

или что-то аналогичное этому.

См. Также:

(Хотя, похоже, никто из них не отвечает на этот вопрос.)

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