API和ABI。
比如c语言的struct,如果struct的大小或者属性的顺序变了,那么以前编译过的程序和共享库之间是不兼容的。
struct s {
int a;
int b;
};
如果修改之后:
struct s {
int a;
int c;
int b;
};
那么如果你按照之前的头文件编译
struct s o;
o.b和现在的o.b的地址是不一样的,之间差了s中的c这个长度。那么执行的时候就会得到错误的结果,需要靠重新编译解决。
为什么get和set是有必要的?
get和set可以将原有的属性之间ABI的不兼容变化成API。get和set的函数是和包含在共享库当中的,这个函数一定会和共享库一起编译。这样ABI之间的不兼容就被API化解了。
要么保持数据结构不变,要么就不要将它暴露给别人。
对于 C,我倾向于前者 — 保持数据结构不变,因为 pst->a = 3; 比 set_s_a( pst, 3 ); 易读多了…考虑到将来的需求可以用 bit 标记,packed/align 标记和附加另一个新数据结构指针。
对于 C++,我倾向于后者 — 不要将它暴露给别人,因为 pst->setA( 3 ); 具有面向对象编程特征…考虑到将来的需求用共享数据指针吧。
欢迎大家一起交流啊~~ ;P
如果回避地址操作是不是就可以了呢?
很难讲数据结构不变,或者直接用通用的数据结构。
比如看看gtk的实现的话,set_a(pst, value)这种东西比比皆是。就是说……面向过程某种程度上还是有点杯具。
或者是直接用字符串作为属性名。
另外其实这也涉及到暴露不暴露的问题。因为比如gtk内部写程序肯定是用->来搞。但是对于外部来说实际上就不应该暴露,都应该用get/set这种东西。
不是一回事。像c语言这种编译成机器码的程序,最后都是按实际内存操作的。
比如a是一个共享库,它按第一个struct编译了。
b是一个调用这个库的程序,它也按第一个struct编译了。
好,现在a更新了,采用第二个struct了,如果b不重新编译的话,它使用的struct a还只知道b和struct a的起始地址差4。而不是差8。
明白了……怀念美好的Python……
struct那个当初编译实习的时候好像注意过