В C есть ли способ объявить экземпляр структуры, к которой всегда обращается определенный указатель? - PullRequest
0 голосов
/ 16 апреля 2020

Я начну с каталогизации того, что я знаю, чтобы отличить guish от того, что я хочу:

  1. Я могу объявить «шаблон» для структуры через `typedef struct astruct ... '
  2. Я могу объявить экземпляр структуры в глобальном или локальном хранилище через astruct mystruct;
  3. Я могу объявить указатель на структуру через astruct *pmystruct;, а затем установить значение этого указателя на экземпляр через pmystruct = &mystruct;

Я хотел бы сделать что-то противоположное # 3: я хотел бы объявить экземпляр структуры, которая определяется как адресуемый конкретным указателем ... что-то вроде:

astruct *pthestruct;
astruct thestruct referencedby(pthestruct);

Тогда мне не нужно было бы префикс любой ссылки на поле в структуре с pthestruct -> thestruct.structdataitem

Это достигается в PL / I с помощью атрибута BASED в объявлении:

DCL PTHESTRUCT POINTER;
DCL 1 THESTRUCT BASED(PTHESTRUCT),
      3 ... (rest of the structure) ;

В коде все ссылки на THESTRUCT будут неявно «базироваться» на адресе в PTHESTRUCT, так же как если бы я закодировал PTHESTRUCT -> THESTRUCT.

Идеи?

Спасибо, Скотт * 10 30 *

Ответы [ 3 ]

2 голосов
/ 16 апреля 2020

Если вы хотите, чтобы thestruct ссылался на *pstruct для значения pstruct во время присваивания / определения thestruct, то C ++ имеет это в своей функции ссылок, но C не делает .

Если вы хотите, чтобы thestruct ссылался на *pstruct для значения pstruct во время использования thestruct, то это можно сделать с помощью макроса:

#define thestruct (*pstruct)

Во многих случаях это считается плохой практикой.

0 голосов
/ 16 апреля 2020

Вы имеете в виду

struct whatever object[1];

Теперь вы можете использовать сам объект

object[0].field = 42;
foo(object[0]); // pass a copy

или указатель (преобразованный в массив)

object->field = 42;
bar(object); // pass a pointer
0 голосов
/ 16 апреля 2020

Вы имеете в виду?

  typedef struct
    {
     int a;
     int b;
    } struct_t;

    struct_t myStruct;
    struct_t* pStruct;

   pStruct = &myStruct;
   pStruct->a =5;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...