Структура поля псевдонимов в C

Мой дизайн включает в себя два слоя, которые делятся некоторыми своими данными друг с другом.

Нижний слой содержит некоторые данные в структуре:

struct Abc {
    int a;
    int b;
    int c;
};

Мне нужно экспортировать b поле Abc структура до верхнего уровня без предоставления доступа к остальным полям. Я хотел бы создать новую переменную (на самом деле псевдоним) в верхнем слое, который расположен в том же месте памяти, что и b поле. Таким образом, оба слоя имеют одну и ту же переменную.

Есть идеи, как это можно сделать, не раскрывая структуру?

3 ответа

Я не уверен, что именно вы подразумеваете под слоями здесь, но я предполагаю, что вам понадобится доступ к одному из членов struct который является частным для одного файла.

В этом случае вы можете просто написать extern Функция "peek" возвращает значение конкретной структурной переменной, которую вы хотите представить другим файлам вашего модуля. Это защитит область действия остальной части структуры, сделав доступным значение этого одного элемента.

Самый простой способ будет:

struct Public
{
    int a;
};

struct Private
{
    struct Public p;
    int b;
    int c;
};

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

Вероятно, вы можете обойтись без Public struct, если она содержит только один член, но лучше быть будущим, и вы никогда не узнаете, когда вам понадобится больше открытых полей.

Такого рода контроль доступа выполним непосредственно в C++; это не выполнимо в C. Вы должны будете использовать дисциплину отказа от доступа к членам, к которым вы не должны иметь доступ.

Есть частичная альтернатива: вы можете превратить закрытую структуру в непрозрачный указатель и иметь функцию, которая знает, как получить b данные. Тогда коду верхнего уровня не нужно ничего видеть из внутренних частей структуры данных нижнего уровня.

upper.h

#include "lower.h"

struct Upper
{
    int p;
    struct Lower *q;
    int r;
};

lower.h

struct Lower *lower_new(void);
void lower_free(struct Lower *);
int lower_b(struct Lower *q);

Код, требующий b поле из нижней структуры в экземпляре верхней структуры, u, написал бы:

struct Upper u = { ... };
int x = lower_b(u.q);

Есть много способов превратить эту схему в ту, которая работает для вас. Обратите внимание, что открытый заголовок для нижней структуры вообще не определяет содержимое структуры; это детали реализации, скрытые в исходном коде -lower.c предположительно.

Другие вопросы по тегам