在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[];
}
一种构造,我在这里和那里都注意到了。你会建议什么?
答案 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 bar
到struct 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; }