내 프로젝트 소스 파일 중 하나 에서이 C 함수 정의를 찾았습니다.
int (foo) (int *bar)
{
return foo (bar);
}
참고 : 옆에 별표가 없으므로 foo
함수 포인터가 아닙니다. 아니면? 재귀 호출로 여기서 무슨 일이 일어나고 있습니까?
답변
전 처리기 작업이 진행되지 않는 경우 foo
의 서명은
int foo (int *bar)
함수 이름 주위에 불필요한 괄호를 넣는 사람들을 본 유일한 컨텍스트는 동일한 이름을 가진 함수와 함수 같은 매크로가 있고 프로그래머가 매크로 확장을 막고 싶을 때입니다.
이 연습은 처음에는 조금 이상해 보일 수 있지만 C 라이브러리는 동일한 매크로를 가진 일부 매크로와 함수를 제공 하여 선례를 설정 합니다 .
이러한 기능 / 매크로 쌍 중 하나는 isdigit()
입니다. 라이브러리는 다음과 같이 정의 할 수 있습니다.
/* the macro */
#define isdigit(c) ...
/* the function */
int (isdigit)(int c) /* avoid the macro through the use of parentheses */
{
return isdigit(c); /* use the macro */
}
귀하의 함수는 위와 거의 동일하게 보이므로 이것이 코드에서도 진행되고 있다고 생각합니다.
답변
본당은 선언을 바꾸지 않고 여전히라는 일반 함수를 정의합니다 foo
.
그것들이 사용 된 이유는 foo
defined 라는 함수형 매크로가 있기 때문에 거의 확실합니다 .
#define foo(x) ...
(foo)
함수 선언에서 사용 하면이 매크로가 확장되지 않습니다. 따라서 일어날 수있는 일은 foo()
함수와 같은 매크로에서 본문이 확장되어 함수 가 정의되고 있다는 것 foo
입니다.
답변
괄호는 의미가 없습니다.
표시하는 코드는 무한 재귀입니다.
함수 포인터를 정의 할 때 가끔 의미있는 이상한 괄호가 나타납니다. 그러나 여기서는 그렇지 않습니다.