我们可以用C编程语言在结构中定义函数吗?
答案 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 link,One 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文件。