在C中部分向前声明结构的成语?

时间:2015-11-10 16:08:08

标签: c struct forward-declaration idioms

在C ++中,当我们定义类或结构时,我们将一些字段设为私有,一些是公共的:

struct foo {
   public:
       int x;
   private:
       float y;
}

。在C中我们不能这样做,但我们可以使用前向声明和getter。在foo.h

struct foo;

foo_get_x(struct foo* f);

foo.c

struct foo {
       int x;
       float y;
}

foo_get_x(struct foo* f) { return f->x; }

现在,假设出于某些原因(例如性能),我希望能够在没有函数调用的情况下直接从仅看到foo.h的代码访问x。我希望某种方式能够以某种方式定义x,并且对于我来说隐藏struct foo的其余部分。我想也许我可以做的工会有一些技巧;或者可能与

合作
struct foo {
   int x;
   char* more_data[];
}

一种构造,我在这里和那里都注意到了。你会建议什么?

3 个答案:

答案 0 :(得分:2)

首先,您尝试将C用作C++不要!但是,如果您愿意这样做,PIMPL idiom可以在这里使用:

foo.h中

struct foo_impl;

struct foo {
  int public_a;
  foo_impl *impl;
};

int foo_get_x(foo const *f);

foo.c的

#include "foo.h"

struct foo_impl {
  int x;
};

int foo_get_x(foo const *f) {
   return f->impl->x;
}

当然,这会增加额外的肤色,你需要特别小心地正确初始化和销毁​​相关的foo_impl对象。

答案 1 :(得分:2)

你可以这样做

/* public header */
struct foo
{ 
  /* "public" parts */
};

/* elsewhere */
struct bar 
{
   struct foo fooPart;
   /* other  stuff */        
};

您可以自由地投射指向struct barstruct foo*类型的指针并返回struct bar*,这可以保证定义明确。

因此,您可以编写分配bar并返回foo*的函数,函数接受foo*,但使用bar

这就是早期的OO软件是用C语言编写的。

答案 2 :(得分:1)

这在C中很难做到,因为你会混淆词汇和语义范围。

这是一种方式(未经测试),并且令人厌恶:

foo.h

中的

struct foo_impl {
       int x;
       float y;
}

struct foo;

inline int foo_get_x(struct foo* f) { return ((struct foo_impl*)f)->x; }