还是很菜的。

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化解了。

要么保持数据结构不变,要么就不要将它暴露给别人。

This entry was posted in Linux. Bookmark the permalink.

6 Responses to 还是很菜的。

  1. nihui says:
    Firefox 3.6.4 Fedora

    对于 C,我倾向于前者 — 保持数据结构不变,因为 pst->a = 3; 比 set_s_a( pst, 3 ); 易读多了…考虑到将来的需求可以用 bit 标记,packed/align 标记和附加另一个新数据结构指针。
    对于 C++,我倾向于后者 — 不要将它暴露给别人,因为 pst->setA( 3 ); 具有面向对象编程特征…考虑到将来的需求用共享数据指针吧。

    欢迎大家一起交流啊~~ ;P

  2. 右京样一 says:
    Google Chrome 8.0.552.215 GNU/Linux

    如果回避地址操作是不是就可以了呢?

  3. csslayer says:
    Firefox 4.0b7 Windows 7

    很难讲数据结构不变,或者直接用通用的数据结构。

    比如看看gtk的实现的话,set_a(pst, value)这种东西比比皆是。就是说……面向过程某种程度上还是有点杯具。

    或者是直接用字符串作为属性名。

    另外其实这也涉及到暴露不暴露的问题。因为比如gtk内部写程序肯定是用->来搞。但是对于外部来说实际上就不应该暴露,都应该用get/set这种东西。

  4. csslayer says:
    Firefox 4.0b7 Windows 7

    不是一回事。像c语言这种编译成机器码的程序,最后都是按实际内存操作的。

    比如a是一个共享库,它按第一个struct编译了。
    b是一个调用这个库的程序,它也按第一个struct编译了。

    好,现在a更新了,采用第二个struct了,如果b不重新编译的话,它使用的struct a还只知道b和struct a的起始地址差4。而不是差8。

  5. 右京样一 says:
    Google Chrome 8.0.552.215 GNU/Linux

    明白了……怀念美好的Python……

  6. 大春儿 says:
    Google Chrome 14.0.835.202 Mac OS X  10.7.2

    struct那个当初编译实习的时候好像注意过

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.