星期四, 12月 29, 2005

C 的隱藏structure

還是在廠商的code看到,----- 應該大家都已經知道。

這是為了隱藏structuer 的內部結構用的方法(應該不是甚麼好動機),通常用在廠商只願意提供object file (或library archive)讓RD link。又不願意release出 要用作library 參數用的stucture內部構造。
arg.h:

struct arg{
char data;
....
};

liba.c:
#include <arg.h>

int lib_get_arg(struct arg **pp)
{
*p=malloc(.....);
...
}

int lib_clean_arg(struct arg *p)
{
free(p);
...
}

libb.c:
#include %lt;arg.h%gt;

int operation(struct arg *p, int oprtation)
{
*p=.....
... = *p...
}
上面的例子, library中包含兩個module : liba.c, libb.c,一個作create working space用,一個依照working space的內容來操作。共同需要的就是workingspace : struct arg 這個structure。
但是這個structure屬於library module內部所需,不希望外界的code會access(Read/Write)到structure內部的資料。所以外部的code : application 主體(main.c) :
extern int lib_get_arg(struct arg **p);
extern int lib_clean_arg(struct arg *p);
extern int operation(struct arg *p,int operation);
這樣compile不會過,因為struct arg 沒有宣告,但是又不知道struct arg的內容到底是甚麼,所以就:
struct arg;
告訴compile 是一個structure,內容不知道,這樣就可以了。
因為C的structure 參數一律傳遞pointer,所以對structure內部結構了不了解不影響compile的動作。
在模組話程式設計裏,這樣的module設計是不好的,叫做??? coupled 。

沒有留言:

網誌存檔