구조에서 기능 정의
C 프로그래밍 언어로 구조에서 함수를 정의할 수 있습니까?
아니요, 함수는 데이터가 아니기 때문에.그러나 구조체 내부에서 함수 포인터를 정의할 수 있습니다.
struct foo {
int a;
void (*workwithit)(struct foo *);
}
매우 간단한 데이터 구조 코스에서 C로 프로그래밍하는 Object Oriented "style"을 조금 가르칠 방법을 찾고 있었기 때문에 이 글을 쓰게 되었습니다.저는 C++의 고급 기능에 대해 더 이상 설명하고 싶지 않았기 때문에 가르치고 싶지 않았습니다.
그러나 저는 파이썬에서 사용되는 OO 패턴을 낮은 수준의 언어/런타임으로 구현하는 방법을 알아보고 싶었습니다.C에서 무슨 일이 일어나고 있는지 설명함으로써 학생들은 Python OO 런타임 패턴을 더 잘 이해할 수 있을 것입니다.그래서 저는 위의 첫 번째 답변에서 조금 벗어나 https://stackoverflow.com/a/12642862/1994792의 패턴을 몇 가지 수정했습니다만, OO의 실행 시간 패턴을 좀 더 명확하게 할 수 있습니다.
우선, 「컨스트럭터」를 포인트로 한 「클래스」를 작성했습니다.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;
}
그런 다음 클래스를 Import하고 클래스에서 개체를 만들고 개체를 사용한 다음 main.c에서 개체를 파기했습니다.
#include "point.c"
int main(void)
{
struct point * p3 = point_new(4,5);
p3->print(p3);
p3->del(p3);
}
'C의 피토닉' 느낌이에요.
C의 구조물 내부에서는 실제로 물건을 신고할 수 없습니다.이것은 C++나 오브젝트가 어떤 범위를 캡슐화하는 다른 OO 언어가 아닙니다.
C구조는 매우 단순한 객체입니다.기억을 관리하기 위한 통사당일 뿐입니다. 구조 를 할 때 "instance"는 "instance"입니다.struct A a;
하면 스택스페이스를 예약할 수 있습니다.a.member
는 그하고 있기 에 그 는 「으로 점프합니다&a
+ 해 + + + + 。컴파일러는 보통 메모리에 더 잘 맞추기 위해 구조에 패딩 비트를 추가하기 때문에 이러한 오프셋은 보통 이전 멤버의 크기 합계가 아닙니다.
도움이 됐으면 좋겠네요.C구조에 대한 기대가 너무 큰 것은 분명합니다:-)
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 파일을 확인합니다.
아니요, 하지만 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 프로그램에서는 구조 내에 함수를 정의할 수 없습니다.단, 파일 확장자가 .cpp(C가 아님)인 경우 클래스 같은 멤버 함수를 가질 수 있지만 이러한 함수의 기본 수식자는 'public'(클래스와 달리)입니다.
Structures a good link, 또 다른 good link, One more good link에 대한 자세한 내용은 다음 링크를 참조하십시오.
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();
}
언급URL : https://stackoverflow.com/questions/9871119/define-functions-in-structs
'programing' 카테고리의 다른 글
"mvn clean package"와 "mvn clean install"은 어떻게 다릅니까? (0) | 2022.08.13 |
---|---|
Vuetify의 v-text-field에서 클립보드로 텍스트를 복사하려면 어떻게 해야 합니까? (0) | 2022.08.11 |
구조에서는 하나의 어레이 필드를 사용하여 다른 어레이 필드에 액세스하는 것이 합법입니까? (0) | 2022.08.11 |
vuex: 비동기 함수에서 기본값 설정 (0) | 2022.08.11 |
CMake를 사용하여 여러 정적 라이브러리를 하나로 결합 (0) | 2022.08.10 |