Создать статический экземпляр структуры в C, не зная реализацию структуры - PullRequest
3 голосов
/ 15 ноября 2011

У меня есть следующий заголовочный файл:

typedef struct my_data my_data_t;
my_data_t* new_my_data(void);
void free_my_data(my_data_t* my_data);

И соответствующий файл c:

typedef struct my_data
{
  int val;
} my_data_t;

my_data_t* new_my_data()
{
  my_data_t* ptr = (my_data_t*)malloc(sizeof(my_data_t));
  return ptr;
}

void free_my_data(my_data_t* my_data)
{
  free(my_data);
}

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

int sizeof_my_data(void);

... и это в файл c:

int sizeof_my_data()
{
  return sizeof(my_data_t);
}

... и сделав что-товот так:

static my_data_t* my_data_instance = static_alloc(sizeof_my_data());

Возможно ли это? Я хотел бы сделать это, потому что целевой машиной для этого кода является микропроцессор, который не обрабатывает malloc (в нашем случае, лучше, чтобы все структуры содержались в статической памяти), и я хотел бы сохранитьфактическая структура данных my_data скрыта от кода, который ее реализует. Любые другие предложения о том, как достичь цели, приветствуются.Благодаря.

Ответы [ 2 ]

3 голосов
/ 15 ноября 2011

Обычный способ сделать это - создать непрозрачную структуру в вашем заголовочном файле с правильным размером. Например:

#define MY_DATA_SIZE 32
struct my_data_t
{
    char opaque_data[MY_DATA_SIZE];
};

Так определяются различные типы данных pthreads (например, pthread_mutex_t).

2 голосов
/ 15 ноября 2011

Как насчет добавления в ваш заголовочный файл

my_data_t *get_static_data();

и в ваш c файл

my_data_t *get_static_data()
{
    static my_data_t static_my_data;
    return &static_my_data;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...