结构可以包含函数吗?
答案 0 :(得分:35)
不,但它们可以包含函数指针。
如果你的意图是在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;
上面的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();
然后,调用函数,如:
// 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");
通过这种方式,单个类型可以用于TCP,SNA,RS232甚至载波pidgeons,具有完全相同的接口。
答案 1 :(得分:5)
编辑使用“数据类型”
清除歧义不在C. struct
类型只能包含数据。
ISO C99标准的第6.7.2.1节。
结构或联合不得包含不完整或功能类型的成员(因此, 结构不应包含自身的实例,但可以包含指向实例的指针 它本身),除了具有多个命名成员的结构的最后一个成员 可能有不完整的数组类型;这样的结构(和任何包含的结合,可能 递归地,这种结构的成员不应该是结构的成员或者 数组的元素。
答案 2 :(得分:0)
在C中,允许结构包含数据值而不包含函数指针。不允许使用C语言,但是在使用gcc检查时,以下工作确实很好。
enter code here
#include <stdio.h>
struct st_func_ptr{
int data;
int (*callback) ();
};
int cb(){
printf(" Inside the call back \n");
return 0;
}
int main() {
struct st_func_ptr sfp = {10, cb};
printf("return value = %d \n",sfp.callback());
printf(" Inside main\n");
return 0;
}
所以,我很困惑......
答案 3 :(得分:0)
没关系。 在linux内核代码中,您会发现许多结构包含函数。 如:
/*
* The type of device, "struct device" is embedded in. A class
* or bus can contain devices of different types
* like "partitions" and "disks", "mouse" and "event".
* This identifies the device type and carries type-specific
* information, equivalent to the kobj_type of a kobject.
* If "name" is specified, the uevent will contain it in
* the DEVTYPE variable.
*/
struct device_type {
const char *name;
struct attribute_group **groups;
int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
void (*release)(struct device *dev);
int (*suspend)(struct device * dev, pm_message_t state);
int (*resume)(struct device * dev);
};
答案 4 :(得分:0)
是的,它可以声明一个函数,并且不允许函数定义,它应该是函数指针。
它基于C99标记结构。
Lokesh V
答案 5 :(得分:0)
#include<iostream>
#include<cstring>
using namespace std;
struct full_name
{
char *fname;
char *lname;
void (*show)(char *,char*);
};
void show(char *a1,char * a2)
{
cout<<a1<<"-"<<a2<<endl;
}
int main()
{
struct full_name loki;
loki.fname="Mohit";
loki.lname="Dabas";
loki.show=show;
loki.show(loki.fname,loki.lname);
return 0;
}
答案 6 :(得分:-1)
他们可以,但在通常的C编程中没有固有的优势。
在C中,无论如何所有函数都在全局空间中,因此您不会通过将它们隐藏在函数中来隐藏任何信息。 paxdiablo的示例是一种将函数组织到结构中的方法,但是您必须看到必须取消引用每个函数才能使用它。
C的标准组织结构是File,with 标头中的接口和源中的实现。
这就是libc的完成方式,这就是几乎所有C库的完成方式。
Moder C编译器允许您在同一源文件中定义和实现函数,甚至可以在头文件中实现静态函数。不幸的是,这会导致一些混乱,你可以得到不寻常的解决方案,如将函数填充到结构体,没有标题的源代码程序等。 你失去了以这种方式将接口与实现分离的优势。