pax*_*blo 36
不,但它们可以包含函数指针.
如果你的意图是在C中做某种形式的多态,那么可以这样做:
typedef struct {
int (*open)(void *self, char *fspec);
int (*close)(void *self);
int (*read)(void *self, void *buff, size_t max_sz, size_t *p_act_sz);
int (*write)(void *self, void *buff, size_t max_sz, size_t *p_act_sz);
// And data goes here.
} tCommClass;
Run Code Online (Sandbox Code Playgroud)
在typedef
上面的是为我工作的一个通用的通信库中创建一个结构.为了初始化变量,您将:
tCommClass *makeCommTcp (void) {
tCommClass *comm = malloc (sizeof (tCommClass));
if (comm != NULL) {
comm->open = &tcpOpen;
comm->close = &tcpOpen;
comm->read = &tcpOpen;
comm->write = &tcpWrite;
}
return comm;
}
tCommClass *makeCommSna (void) {
tCommClass *comm = malloc (sizeof (tCommClass));
if (comm != NULL) {
comm->open = &snaOpen;
comm->close = &snaOpen;
comm->read = &snaOpen;
comm->write = &snaWrite;
}
return comm;
}
tCommClass *commTcp = makeCommTcp();
tCommClass *commSna = makeCommSna();
Run Code Online (Sandbox Code Playgroud)
然后,调用函数,如:
// Pass commTcp as first params so we have a self/this variable
// for accessing other functions and data area of object.
int stat = (commTcp->open)(commTcp, "bigiron.box.com:5000");
Run Code Online (Sandbox Code Playgroud)
通过这种方式,单个类型可以用于TCP,SNA,RS232甚至载波pidgeons,具有完全相同的接口.
编辑使用'数据类型'清除歧义
不在C. struct
类型中只能包含数据.
来自ISO C99标准的第6.7.2.1节.
结构或联合不应包含具有不完整或函数类型的成员(因此,结构不应包含其自身的实例,但可以包含指向其自身实例的指针),除了结构的最后一个成员具有多个一个命名成员可能有不完整的数组类型; 这样的结构(以及可能递归地包含这种结构的成员的任何联合)不应是结构的成员或数组的元素.