Почему нельзя скрывать реализацию структуры таким образом?
Мы видели некоторый код C / C ++, используя хитрость, чтобы скрыть реализацию структуры, используя непрозрачную (теневую) структуру того же размера:
Вprivate.h
Точная реализация структуры объявляется:
typedef struct private_struct
{
private_foo_t f1;
private_bar_t b[2];
private_baz_t *bz;
int val;
} private_t;
#define PRIVATE_SIZE (sizeof(private_t))
Вpublic.h
объявлена открытая структура для хранения непрозрачного массива байтов:
#include "private.h"
typedef struct public_struct
{
char opaque[PRIVATE_SIZE];
} public_t;
public_t
а такжеprivate_t
поделиться одинаковым размером.
Пользователи могут сами выделить хранилище для частной реализации, используя открытую структуру:
#include
int main(void)
{
public_t pub;
return public_api(&pub);
}
Реализация может получить доступ к скрытой реализации:
#include "private.h"
int public_api(public_t *pub)
{
private_t *priv = (private_t *) pub;
return priv->val;
}
Это кажется довольно изящным приемом, позволяющим пользователям выделять хранилище для переменных (например, объявлять статические переменные) .I '
я портирую проприетарный исходный код, используя этот трюк на различные встроенные системы, но яЯ не чувствую уверенности в том, как структураpub_t
объявлен
Что может быть не так с этим трюком?