在结构中定义函数

时间:2012-03-26 11:17:40

标签: c

我们可以用C编程语言在结构中定义函数吗?

10 个答案:

答案 0 :(得分:62)

不,因为功能不是数据。但是你可以在struct中定义函数指针。

struct foo {
    int a;
    void (*workwithit)(struct foo *);
}

答案 1 :(得分:21)

你无法真正在C中的结构中声明内容。这不是C ++或任何其他OO语言,其中一个对象封装了某种范围。

C结构是非常简单的对象,它只是管理一块内存的语法糖。当您创建新的struct“instance”,struct A a;时,编译器会根据其大小保留堆栈空间,然后当您执行a.member时,编译器知道该成员的偏移量,因此它会跳转到{{1} } +该成员的偏移量。这些偏移通常不仅仅是前面成员大小的总和,因为编译器通常会在结构中添加一些填充位,以便将它更好地对齐到内存中。

希望它有所帮助。你显然希望C结构稍微过多: - )

答案 2 :(得分:4)

不,你不能在C程序中的struct里面有函数。我写了一个代码并将其保存为.c和.cpp。 .cpp文件符合并按预期工作,但.c文件甚至无法编译。

以下是供您参考的代码。将其保存为.cpp,然后运行它。然后保存与.c相同的代码并编译它。您将收到编译错误。

#include <stdio.h>
struct C {
    void Test(int value) {
       static int var = 0;
       if (var == value) 
          printf("var == value\n");
       else
          printf("var != value\n");

       var = value;
     }
 }; 

 int main() {
    C c1;
    C c2;
    c1.Test(100);
    c2.Test(100);
    int ii;
    scanf("%d",&ii);
 }

答案 3 :(得分:3)

没有

你可以在结构中使用函数指针,但这样就近了。

答案 4 :(得分:1)

不,你不能。结构只能在里面包含变量,在结构中存储函数指针可以给你想要的结果。

答案 5 :(得分:1)

之所以来到此职位,是因为我正在寻找一种方法,以针对非常简单的数据结构课程讲授一些用C语言进行的面向对象的“样式”编程。我不想教C ++,因为我不想一直解释其更高级的功能。

但是我想探索一个人如何实现 Python中使用的OO模式,但要使用低级语言/运行时。通过解释C语言中发生的事情,学生可能会更好地了解Python OO运行时模式。因此,我超出了上面的第一个答案,并改编了https://stackoverflow.com/a/12642862/1994792中的某些模式,但以某种方式可以阐明OO运行时模式。

首先,我在 point.c 中使用“构造函数”创建了“类”:

#include <stdio.h>
#include <stdlib.h>

struct point
{
    int x;
    int y;
    void (*print)(const struct point*);
    void (*del)(const struct point*);
};

void point_print(const struct point* self)
{
    printf("x=%d\n", self->x);
    printf("y=%d\n", self->y);
}

void point_del(const struct point* self) {
  free((void *)self);
}

struct point * point_new(int x, int y) {
    struct point *p = malloc(sizeof(*p));
    p->x = x;
    p->y = y;
    p->print = point_print;
    p->del = point_del;
    return p;
}

然后我导入该类,从该类构造一个对象,使用该对象,然后在 main.c

中销毁该对象。
#include "point.c"

int main(void)
{
    struct point * p3 = point_new(4,5);
    p3->print(p3);
    p3->del(p3);
}

感觉非常“ C语言的Python风格”。

答案 6 :(得分:0)

,您无法在C程序中定义结构内部的函数,但是如果文件的扩展名为.cpp(不是C ),则可以拥有成员类似函数,但这些函数的默认修饰符将是'public'(与class不同)。

阅读这些链接,了解有关结构的更多信息a good link another good linkOne more good link

作为C ++中的惯例,用于存储函数和变量结构仅用于存储信息 (即数据)

答案 7 :(得分:0)

不,但你可以在c ++ struct!

答案 8 :(得分:0)

您可以改为使用C ++:

// Example program
#include <iostream>
#include <string>

struct Node
{
    int data; Node *prev,*next;
    Node(int x, Node* prev=NULL, Node* next=NULL)
    {
        this->data=x; this->prev=prev; this->next=next;
    }
    void print_list()
    {
        Node* temp=this;    //temp is created in function call stack
        while(temp!=NULL)
        {
            std::cout<<temp->data<<" ";
            temp=temp->next;
        }
    }
    Node* insert_left(int x)
    {
        Node* temp=new Node(x,this->prev,this);
        this->prev=temp;
        return temp;                            //list gets new head
    }
    Node* insert_right(int x)
    {
        Node* temp=new Node(x,this,this->next);
        this->next=temp;
        return this;                            //this would still be head
    }

};

int main()
{
    Node* head=new Node(-1);    //-1
    head=head->insert_left(0);  //0 -1
    head=head->insert_right(1); //0 1 -1
    head=head->insert_left(2);  //2 0 1 -1
    head->print_list();
}

答案 9 :(得分:-1)

您只能在C中使用函数指针。在结构初始化之后,将实函数的地址分配给该指针,例如:

#include <stdio.h>
#include <stdlib.h>

struct unit
{
  int result;
  int (*add) (int x, int y);
};

int sumFunc(int x, int y) { return x + y; }

void *unitInit()
{
  struct unit *ptr = (struct unit*) malloc(sizeof(struct unit));
  ptr->add = &sumFunc;
  return ptr;
}

int main(int argc, char **argv)
{
  struct unit *U = unitInit();

  U->result = U->add(5, 10);

  printf("Result is %i\n", U->result);

  free(U);

  return 0;
}

在结构中使用函数指针的好例子,您可以在这里https://github.com/AlexanderAgd/CLIST中找到 检查标头,然后检查clist.c文件。