C에서 함수에 매개변수로 함수를 전달할 수 있습니까?

12105 단어 cppclinuxprogramming
Python이나 JavaScript와 같은 고급 언어에서 작업할 때마다 함수를 함수에 매개 변수로 전달하고 호출할 수 있습니다. 그런데 C/C++와 같은 저급 언어에서도 가능합니까?

예! 이것은 C/C++에서도 가능하지만 약간 다른 방식입니다. 우리는 C/C++에서 포인터로 메모리 주소에 접근할 수 있다는 것을 알고 있습니다. 따라서 포인터를 사용하여 array , int , char 또는 다른 데이터 유형에 대해 수행하는 것과 동일한 함수를 가리킬 수도 있습니다.

아주 간단한 프로그램부터 시작해 봅시다.

암호

#include<stdio.h>

int add(int a, int b) {
    return a+b;
}

//                  function as param
//                ___________^_____________
int do_operation(int (* operation)(int, int), int a, int b) {
    return operation(a, b);
}

int main(int argc, char const *argv[])
{
    printf("%d\n", do_operation(add, 10, 20));
    return 0;
}


산출

30


위의 코드에서 함수 do_operation에서 무슨 일이 일어나고 있습니까?



매개변수int (* operation)(int, int)는 이름이 operation 인 함수 시그니처입니다. 그것에 대해 더 설명하겠습니다.

  int  (* operation) (int, int)
   ^          ^         ^
  left    identifier   right


  • 식별자: 함수 이름(작업)
  • 왼쪽: 함수 반환 유형(int)
  • right: params type function accept (int, int)

  • 따라서 다음과 같이 함수를 선언할 수 있습니다.

    return_type (* function_name) (param1, param2);
    


    하지만 이 함수를 여러 함수에서 사용해야 한다면 어떻게 될까요? 모든 곳에서 이렇게 선언해야 할까요?



    아니요. 생명의 은인typedef이 있습니다. 우리는 함수 서명을 typedef 할 수 있고 어디에서나 사용할 수 있습니다. 예를 들어 위의 함수 서명을 다음과 같이 선언할 수 있습니다.

    typedef int (* operation)(int, int);
    
    int do_operation(operation op, int a, int b) {
        return op(a, b);
    }
    


    이것은 매우 간단하고 읽기 쉽지 않습니까?

    출처: freepik.com


    이제 함수를 매개변수로 전달하는 것이 어떻게 유용할 수 있는지에 대한 복잡한 예를 살펴보겠습니다.

    암호

    #include <stdio.h>
    
    
    /**
     * Defining internal functions
    */
    int _multiply(int a, int b) {
        return a*b;
    }
    
    int _subtract(int a, int b) {
        return a-b;
    }
    
    int _add(int a, int b) {
        return a+b;
    }
    
    
    // Functions name
    typedef enum {
        ADD, SUBTRACT, MULTIPLY
    } Operations;
    
    // declaring function type
    typedef int (*function_t)(int, int);
    
    // struct to hold multiple functions
    typedef struct {
        Operations op;
        char name[31];
        function_t fun;
    } Operation_t;
    
    // Initialize functions array
    Operation_t operations[] = {
        {ADD, "Add", _add}, 
        {SUBTRACT, "Subtract", _subtract}, 
        {MULTIPLY, "Multiply", _multiply}
    };
    
    /**
     * Function to do multiple operating by just function name
    */
    void do_operation(Operations op, int a, int b) {
        for (int i=0; i<sizeof(operations)/sizeof(Operation_t); i++) {
            if (op == operations[i].op) {
                printf("Operation: %s\n", operations[i].name);
                printf("Result: %d\n\n", operations[i].fun(a, b));
                return;
            }
        }
    
        printf("Invalid Operation\n");
    }
    
    
    int main() {
        // calling the with function name to perform operation
        do_operation(ADD, 10, 20);
        do_operation(SUBTRACT, 10, 20);
        do_operation(MULTIPLY, 10, 20);
        return 0;
    }
    


    산출

    Operation: Add
    Result: 30
    
    Operation: Subtract
    Result: -10
    
    Operation: Multiply
    Result: 200
    


    위의 코드에서 함수 이름을 전달하기만 하면 실행할 수 있음을 알 수 있습니다.


    This article is highly inspired by the content provided by Jacob Sorber on his .



    ❤️이 글을 읽어주셔서 정말 감사합니다. 저는 새로운 것을 배우는 열정적인 공대생이므로 실수를 발견하거나 제안할 사항이 있으면 댓글로 알려주세요.

    또한 이 게시물이 어떤 식으로든 도움이 된다면 공유하고 엄지손가락을 치켜세우는 것을 고려하십시오.

    좋은 웹페이지 즐겨찾기