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)
{
}
답변
C로 코딩하는 많은 사람들이 이제 C ++ 컴파일러 (예 : Visual C ++ 및 Keil uVision)를 사용하고 있으므로 이것을 사용할 수 있다고 언급했습니다.
아직 C에서 허용되지는 않지만 C ++를 사용하는 경우 C ++ 11에 도입 된 람다 함수를 사용하여 동일한 효과를 얻을 수 있습니다.
void f()
{
auto g = [] () { /* Some functionality */ }
g();
}
답변
다른 사람들이 대답했듯이 표준 C는 중첩 함수를 지원하지 않습니다.
일부 언어에서는 중첩 함수를 사용하여 여러 함수와 변수를 컨테이너 (외부 함수)로 묶어 개별 함수 (외부 함수 제외)와 변수가 외부에서 보이지 않도록합니다.
C 에서는 이러한 함수를 별도의 소스 파일에 넣어이를 수행 할 수 있습니다. 주 함수를 전역으로 정의하고 다른 모든 함수와 변수를 정적 으로 정의합니다 . 이제이 모듈 외부에는 주 기능 만 표시됩니다.
답변
두 번째 질문에 답하기 위해 중첩 함수를 정의 할 수있는 언어가 있습니다 (목록은 여기에서 찾을 수 있습니다 : nested-functions-language-list-wikipedia ).
가장 유명한 언어 중 하나 인 JavaScript에서 중첩 함수 (클로저라고 함) 중 하나는 다음과 같습니다.
- 객체 생성자에서 클래스 메서드를 생성합니다.
- setter 및 getter와 함께 private 클래스 멤버의 기능을 수행합니다.
- 전역 네임 스페이스를 오염시키지 마십시오 (물론 모든 언어에 적용됩니다).
몇 가지 예를 들면 …
