代码之家  ›  专栏  ›  技术社区  ›  Shweta

结构中的功能

  •  28
  • Shweta  · 技术社区  · 15 年前

    结构可以包含函数吗?

    7 回复  |  直到 15 年前
        1
  •  36
  •   paxdiablo    15 年前

    不,但它们可以包含函数 指针。

    如果您的意图是在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,接口完全相同。

        2
  •  5
  •   wkl    15 年前

    使用“数据类型”编辑清除歧义

    不在C。 struct 类型只能包含数据。

    来自ISO C99标准第6.7.2.1节。

    结构或联合体不得包含不完整或功能类型的成员 (因此, 结构不应包含自身的实例,但可以包含指向实例的指针 ,但具有多个命名成员的结构的最后一个成员除外 可能具有不完整的数组类型;这样的结构(以及可能包含 递归地,属于这种结构的构件)不应是结构的构件或 数组的元素。

        3
  •  0
  •   Jens Gustedt    15 年前

    在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;
    }
    

    所以,我很困惑。。。

        4
  •  0
  •   Tony    15 年前

    没关系。 在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);
    };
    
        5
  •  0
  •   user513391    15 年前

    是的,它可以声明一个函数,而函数定义是不允许的,它应该是函数指针。

    它基于C99标记结构。

    洛凯什五世

        6
  •  0
  •   Rarblack Kev1n91    7 年前

    不,你不能。结构不能包含函数的声明,但可以包含函数的定义。结构只能包含数据类型、指针、指向不同函数的指针。可以将指针指向函数,然后从结构访问。

    #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;     
    }
    
        7
  •  -1
  •   Chris Reid    9 年前

    它们可以,但在通常的C编程中没有固有的优势。

    在C语言中,所有函数都在全局空间中,因此将它们塞进函数中不会隐藏任何信息。paxdiablo的例子是一种将函数组织到结构中的方法,但是您必须看到无论如何都必须取消对每个函数的引用才能使用它。

    C的标准组织结构是 头中的接口和源中的实现。

    libc就是这样做的,几乎所有的C库都是这样做的。

    Moder C编译器允许您在同一个源文件中定义和实现函数,甚至在头文件中实现静态函数。不幸的是,这会导致一些混乱的地方,你可以得到一些不寻常的解决方案,如把函数塞进结构,只有源代码的程序没有头,等等。 这样就失去了将接口与实现分离的优势。