C 在结构中定义函数

C 在结构中定义函数,c,C,我们可以用C语言在结构中定义函数吗?否 在结构中可以有函数指针,但这是最接近的。否,因为函数不是数据。但是您可以在结构中定义函数指针 struct foo { int a; void (*workwithit)(struct foo *); } 不,你不能。结构中只能包含变量,将函数指针存储在结构中可以得到所需的结果。否,在C程序中不能在结构中定义函数,但是如果文件扩展名为.cpp(不是C),您可以拥有类似类的成员函数,但是这些函数的默认修饰符将是“public”(与类不同)

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


在结构中可以有函数指针,但这是最接近的。

否,因为函数不是数据。但是您可以在结构中定义函数指针

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

不,你不能。结构中只能包含变量,将函数指针存储在结构中可以得到所需的结果。

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

有关结构的更多信息,请阅读这些链接


作为C++中的约定,<强>类< /强>用于存储函数和变量,而<强>结构< /强>仅用于存储信息(即数据)。P> > P>你不能在C中的结构中声明内容。这不是C++或任何其他OO语言,其中对象封装了某种范围。

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


希望能有点帮助。显然,您对C结构的期望有点过高:-)

不,在C程序的结构中不能有函数。我只编写了一段代码,并将其保存为.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);
 }
#包括
结构C{
无效测试(int值){
静态int-var=0;
如果(var==值)
printf(“var==value\n”);
其他的
printf(“var!=value\n”);
var=价值;
}
}; 
int main(){
c1;
c2;
c1.试验(100);
c2.试验(100);
int ii;
scanf(“%d”和“ii”);
}

<代码> > P>不,但您可以在C++结构中!

>你可以用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();
}
//示例程序
#包括
#包括
结构体类型
{
int数据;节点*prev,*next;
节点(int x,节点*prev=NULL,节点*next=NULL)
{
此->数据=x;此->上一个=上一个;此->下一个=下一个;
}
作废打印列表()
{
Node*temp=this;//在函数调用堆栈中创建temp
while(temp!=NULL)
{
标准::库特普雷夫=温度;
return temp;//列表获取新头
}
节点*右插入(int x)
{
Node*temp=新节点(x,this,this->next);
这个->下一个=温度;
返回此;//这仍然是头
}
};
int main()
{
节点*头=新节点(-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();
}

> p>我来到这个职位是因为我在寻找一种方法来教一点面向对象的“风格”在C中编程,这是一个非常简单的数据结构课程。我不想教C++,因为我不想继续解释它更高级的特性。 但我想探索如何用低级语言/运行时实现Python中使用的OO模式。通过解释C语言中发生的事情,学生们可能会更好地理解Python OO运行时模式。因此,我超越了上面的第一个答案,对其中一些模式进行了改编,但采用了一种解释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;
}

在C中感觉非常“Pythonic”。

在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;
}
#包括
#包括
结构单元
{
int结果;
整数(*添加)(整数x,整数y);
};
int-sumFunc(intx,inty){返回x+y;}
void*unitInit()
{
结构单元*ptr=(结构单元*)malloc(sizeof(结构单元));
ptr->add=&sumFunc;
返回ptr;
}
int main(int argc,字符**argv)
{
结构单元*U=unitInit();
U->result=U->add(5,10);
printf(“结果是%i\n”,U->Result);
免费(U);
返回0;
}
在结构中使用函数指针的好例子可以在这里找到
检查头,然后CIST.C文件。< /P>你是指像Stult{SuffF(Value}){ }}吗?你的意思是:“但是,如果你用一种叫做C++的不同编程语言编译这个……”你是对的@Lundin,实际上在初级阶段,很少有学生会因为在.cpp文件中编写C代码而感到困惑,这是一个很糟糕的做法。所以我回答他的问题是“不,”.你错过了那个部分吗?从什么时候开始,C程序中就不可能有函数了?我是说C程序中的.Struct.Will修复了它。谢谢。这真的很有启发性,我觉得我找到了一个复活节彩蛋。这应该有更多的投票权!但问题是,为什么你在释放指针之前要投空指针?@drchuck我同意tgabb的观点,你的帖子太好了!它帮了我很多。太好了!@tgabb-free()函数需要一个(void*)作为它的参数。所以我试图避免任何警告消息。
#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;
}