【问题标题】:Create static instance of struct in C without knowing struct implementation在不知道结构实现的情况下在 C 中创建结构的静态实例
【发布时间】:2011-11-15 15:31:02
【问题描述】:

我有以下头文件:

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);
}

我想在不使用 malloc 的情况下在静态内存中创建 my_data_t 的实例。我想通过在头文件中添加以下内容来做到这一点:

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 的实际数据结构隐藏在实现它的代码中。 欢迎任何其他关于如何实现目标的建议。谢谢。

【问题讨论】:

    标签: c static malloc


    【解决方案1】:

    通常的做法是在你的头文件中创建一个大小正确的不透明结构。例如:

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

    这就是各种 pthreads 数据类型(例如pthread_mutex_t)的定义方式。

    【讨论】:

    • 请注意,这种技术可能会遇到对齐问题,因为char 只需要字节对齐,但更复杂的结构通常有更强的对齐要求。
    • 很好,雷蒙德。现在我仔细看看,pthreads 类型被定义为适当大小的char 数组和提供所需对齐的另一种类型(例如long int)的联合。
    【解决方案2】:

    添加到你的头文件怎么样

    my_data_t *get_static_data();
    

    到你的 c 文件

    my_data_t *get_static_data()
    {
        static my_data_t static_my_data;
        return &static_my_data;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多