结构接口

Mar*_*rco 2 c struct

定义new时struct更好的是定义该类型的接口
(即"setter"和"getter"函数)或直接通过.->运算符访问成员?

编辑
普通C编程

Pav*_*aev 13

这取决于您的结构是否是抽象数据类型.如果你在头文件中公开结构定义,那么定义访问器没有任何意义--API客户端仍然可以直接读/写字段,而在C中,他们确实有合理的期望它可以工作.

另一方面,您可能希望完全隐藏结构,并仅向客户端显示其声明,作为一种不透明的句柄:

foo.h中:

typedef struct foo foo;

foo* foo_create();
void foo_free(foo*);
int foo_get_bar(foo*);
void foo_set_bar(foo*, int);
Run Code Online (Sandbox Code Playgroud)

Foo.cpp中:

struct foo { 
  int bar;
};

foo* foo_create() { return malloc(sizeof(foo)); }

void foo_free(foo* p) { free(p); }

int foo_get_bar(foo* p) { return p->bar; }

void foo_set_bar(foo* p, int newval) { p->bar = nwval; }
Run Code Online (Sandbox Code Playgroud)

client.cpp:

#include "foo.h"

foo* f = foo_create();
f->bar = 123; // compile error, bar is not defined
foo_set_bar(f, 123); // ok
Run Code Online (Sandbox Code Playgroud)

这样做的原因是1)封装,与OO相同,以及2)版本控制 - 您可以向结构中添加新字段,或者自由地重新组织它们,旧代码将保持二进制兼容.