C에 내포된 함수
C에 네스트 함수를 가질 수 있나요?중첩된 함수의 용도는 무엇입니까?C에 존재하는 경우 컴파일러마다 구현이 다릅니까?
표준 C에서는 다른 함수 내에서 함수를 정의할 수 없습니다.
함수 내부에 함수를 선언할 수 있지만 중첩된 함수는 아닙니다.
gcc에는 네스트된 함수를 허용하는 언어 확장자가 있습니다.이들은 비표준이므로 컴파일러에 전적으로 의존합니다.
아니요, C에는 없어요.
Pascal과 같은 언어에서 사용되는 이유는 다음과 같습니다.
- 네임스페이스를 오염시키지 않고 기능을 분해할 수 있습니다.하나 이상의 중첩된 함수를 사용하여 문제를 더 작은 논리적 조각으로 분할함으로써 몇 가지 복잡한 로직을 구현하는 단일 공개 표시 함수를 정의할 수 있습니다.
- 경우에 따라 매개 변수 전달을 단순화합니다.중첩된 함수는 외부 함수의 범위에 있는 모든 파라미터와 일부 또는 모든 변수에 액세스할 수 있으므로 외부 함수는 로컬 상태의 더미를 중첩된 함수에 명시적으로 전달할 필요가 없습니다.
요, 안 요.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
'IT이야기' 카테고리의 다른 글
vue/vuex에서 편집 저장 또는 취소 (0) | 2022.05.28 |
---|---|
Android 폰에서 방향 확인 (0) | 2022.05.28 |
Vuelidate를 사용하는 상위 구성 요소의 하위 구성 요소에서 양식 입력 필드 검증 (0) | 2022.05.28 |
VueJS v-bind가 kebab-case와 함께 작동하지 않음 (0) | 2022.05.28 |
두 개의 큰 정수를 곱하는 동안 오버플로우 포착 및 계산 (0) | 2022.05.28 |