IT이야기

C에 내포된 함수

cyworld 2022. 5. 28. 10:14
반응형

C에 내포된 함수

C에 네스트 함수를 가질 수 있나요?중첩된 함수의 용도는 무엇입니까?C에 존재하는 경우 컴파일러마다 구현이 다릅니까?

표준 C에서는 다른 함수 내에서 함수를 정의할 수 없습니다.

함수 내부에 함수를 선언할 수 있지만 중첩된 함수는 아닙니다.

gcc에는 네스트된 함수를 허용하는 언어 확장자가 있습니다.이들은 비표준이므로 컴파일러에 전적으로 의존합니다.

아니요, C에는 없어요.

Pascal과 같은 언어에서 사용되는 이유는 다음과 같습니다.

  1. 네임스페이스를 오염시키지 않고 기능을 분해할 수 있습니다.하나 이상의 중첩된 함수를 사용하여 문제를 더 작은 논리적 조각으로 분할함으로써 몇 가지 복잡한 로직을 구현하는 단일 공개 표시 함수를 정의할 수 있습니다.
  2. 경우에 따라 매개 변수 전달을 단순화합니다.중첩된 함수는 외부 함수의 범위에 있는 모든 파라미터와 일부 또는 모든 변수에 액세스할 수 있으므로 외부 함수는 로컬 상태의 더미를 중첩된 함수에 명시적으로 전달할 필요가 없습니다.

요, 안 요.C가능한 한 가까운 값은 다른 함수의 정의 내에서 함수를 선언하는 것입니다. 이 는 다른 본문 .

예.

void f(void)
{
    // Declare a function called g
    void g(void);

    // Call g
    g();
}

// Definition of g
void g(void)
{
}

중첩된 함수는 ANSI C의 일부아니지만 Gnu C일부입니다.

C에서 코딩하는 많은 사람들이 현재 C++ 컴파일러(Visual C++나 Keil uVision 등)를 사용하고 있기 때문에, 이것을 이용할 수 있을지도 모릅니다.

C에서는 아직 허용되지 않지만 C++를 사용하는 경우 C++11에서 도입된 람다 함수를 사용하여 동일한 효과를 얻을 수 있습니다.

void f()
{
    auto g = [] () { /* Some functionality */ }

    g();
}

이것은 C에 네스트된 함수가 아닙니다(displayAccounts() 함수).

함수를 다르게 정의하고 변수를 넘길 수도 있었지만 계정을 여러 번 인쇄해야 했기 때문에 어쨌든 잘 작동합니다.

(학교 과제에서 인용)

//function 'main' that executes the program.
int main(void)
{
    int customerArray[3][3] = {{1, 1000, 600}, {2, 5000, 2500}, {3, 10000, 2000}};  //multidimensional customer data array.
    int x, y;      //counters for the multidimensional customer array.
    char inquiry;  //variable used to store input from user ('y' or 'n' response on whether or not a recession is present).

    //function 'displayAccounts' displays the current status of accounts when called.
    void displayAccounts(void)
    {
        puts("\t\tBank Of Despair\n\nCustomer List:\n--------------");
        puts("Account #    Credit Limit\t  Balance\n---------    ------------\t  -------");
        for(x = 0; x <= 2; x++)
        {
            for(y = 0; y <= 2; y++)
                printf("%9d\t", customerArray[x][y]);
            puts("\n");
        }
    }

    displayAccounts();  //prints accounts to console.
    printf("Is there currently a recession (y or n)? ");


//...

    return 0;
}

두 번째 질문에 답하려면 중첩된 함수를 정의할 수 있는 언어가 있습니다(목록은 여기서 찾을 수 있습니다. nested-functions-language-wikipedia).

이러한 언어 중 가장 유명한 언어인 JavaScript에서 중첩된 함수(클로저라고 함)는 다음과 같습니다.

  • 객체의 생성자에 클래스 메서드를 만듭니다.
  • 세터, 게터와 함께 개인 클래스 멤버의 기능을 실현합니다.
  • 글로벌 네임스페이스를 오염시키지 않기 위해서입니다(물론 모든 언어에 해당).

몇 가지 예를 들면...

다른 사용자가 답한 바와 같이 표준 C는 중첩된 함수를 지원하지 않습니다.

중첩된 함수는 개별 함수(외부 함수 제외)와 변수가 외부에서 보이지 않도록 여러 함수와 변수를 컨테이너(외부 함수)로 둘러싸기 위해 일부 언어에서 사용됩니다.

C 에서는, 이러한 기능을 다른 소스 파일에 넣는 것으로 실행할 수 있습니다.주요 함수를 전역으로 정의하고 다른 모든 함수 및 변수를 정적 함수로 정의합니다.이제 주요 기능만 이 모듈 밖에서 볼 수 있습니다.

또는 스마트하게 프리프로세서를 사용할 수 있습니다(고객에게 유리하게).source.c):

#ifndef FIRSTPASS
#include <stdio.h>

//here comes your "nested" definitions
#define FIRSTPASS
#include "source.c"
#undef FIRSTPASS

main(){
#else
    int global = 2;
    int func() {printf("%d\n", global);}
#endif
#ifndef FIRSTPASS
    func();}
#endif

언급URL : https://stackoverflow.com/questions/2608158/nested-function-in-c

반응형