结构中的功能

时间:2010-11-19 06:32:13

标签: c function struct

结构可以包含函数吗?

7 个答案:

答案 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编译器允许您在同一源文件中定义和实现函数,甚至可以在头文件中实现静态函数。不幸的是,这会导致一些混乱,你可以得到不寻常的解决方案,如将函数填充到结构体,没有标题的源代码程序等。 你失去了以这种方式将接口与实现分离的优势。