programing

구조에서 기능 정의

projobs 2022. 8. 11. 00:04
반응형

구조에서 기능 정의

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

반응형