C에서 중첩 함수를 가질 수 있습니까? 중첩 함수의 사용은 무엇입니까? C에 존재한다면 컴파일러마다 구현이 다른가요?
C에서 중첩 함수를 가질 수 있습니까? 중첩 함수의 사용은 무엇입니까? C에 존재한다면 컴파일러마다 구현이 다른가요?
답변:
표준 C의 다른 함수 내에 함수를 정의 할 수 없습니다.
함수 내부에서 함수 를 선언 할 수 있지만 중첩 된 함수는 아닙니다.
gcc에는 중첩 된 함수를 허용하는 언어 확장이 있습니다 . 표준이 아니므로 완전히 컴파일러에 의존합니다.
아니요, C에는 존재하지 않습니다.
Pascal과 같은 언어에서 사용되는 이유는 최소한 두 가지입니다.
중첩 된 기능의 일부가 아닌 ANSI C 그러나, 그들은의 일부 GNU C .
아니요 .NET에서 중첩 된 함수를 가질 수 없습니다 C
. 가장 가까운 방법은 다른 함수의 정의 안에 함수를 선언하는 것입니다. 하지만 그 함수의 정의는 다른 함수 본문 외부에 나타나야합니다.
예
void f(void)
{
// Declare a function called g
void g(void);
// Call g
g();
}
// Definition of g
void g(void)
{
}
g
가 나중에 파일에서 표시되면 선언이 나머지 번역 단위의 범위에 포함됩니다. 또한 바람직하지 않은 경우에도 범위에서 보이는 선언없이 C에서 함수를 호출 할 수 있습니다 .
C로 코딩하는 많은 사람들이 이제 C ++ 컴파일러 (예 : Visual C ++ 및 Keil uVision)를 사용하고 있으므로 이것을 사용할 수 있다고 언급했습니다.
아직 C에서 허용되지는 않지만 C ++를 사용하는 경우 C ++ 11에 도입 된 람다 함수를 사용하여 동일한 효과를 얻을 수 있습니다.
void f()
{
auto g = [] () { /* Some functionality */ }
g();
}
다른 사람들이 대답했듯이 표준 C는 중첩 함수를 지원하지 않습니다.
일부 언어에서는 중첩 함수를 사용하여 여러 함수와 변수를 컨테이너 (외부 함수)로 묶어 개별 함수 (외부 함수 제외)와 변수가 외부에서 보이지 않도록합니다.
C 에서는 이러한 함수를 별도의 소스 파일에 넣어이를 수행 할 수 있습니다. 주 함수를 전역으로 정의하고 다른 모든 함수와 변수를 정적 으로 정의합니다 . 이제이 모듈 외부에는 주 기능 만 표시됩니다.
outer
-> nested
-> outer
->를 nested
보유하는 두 개의 다른 프레임이 int declared_in_outer
있으므로 declared_in_outer
정적 전역으로 넣을 수 없습니다 .
두 번째 질문에 답하기 위해 중첩 함수를 정의 할 수있는 언어가 있습니다 (목록은 여기에서 찾을 수 있습니다 : nested-functions-language-list-wikipedia ).
가장 유명한 언어 중 하나 인 JavaScript에서 중첩 함수 (클로저라고 함) 중 하나는 다음과 같습니다.
몇 가지 예를 들면 ...
또는 그것에 대해 현명하고 유리하게 전처리기를 사용할 수 있습니다 ( 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
이것은 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;
}