Почему нельзя скрывать реализацию структуры таким образом?

Мы видели некоторый код 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 объявлен

Что может быть не так с этим трюком?

Ответы на вопрос(2)

Ваш ответ на вопрос