[c] 함수 이름 주위의 괄호는 무엇을 의미합니까?

내 프로젝트 소스 파일 중 하나 에서이 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.

그것들이 사용 된 이유는 foodefined 라는 함수형 매크로가 있기 때문에 거의 확실합니다 .

#define foo(x) ...

(foo)함수 선언에서 사용 하면이 매크로가 확장되지 않습니다. 따라서 일어날 수있는 일은 foo()함수와 같은 매크로에서 본문이 확장되어 함수 가 정의되고 있다는 것 foo입니다.


답변

괄호는 의미가 없습니다.
표시하는 코드는 무한 재귀입니다.

함수 포인터를 정의 할 때 가끔 의미있는 이상한 괄호가 나타납니다. 그러나 여기서는 그렇지 않습니다.


답변