2013-06-20 1 views
2

나는 내가 이해했던 몇 가지 코드를 보여 주었다.왜 함수를 괄호로 묶으시겠습니까?

다음 코드는 예제 코드입니다.

static void (_func)(int p); 

int main() 
{ 
.... 
    _func(3); 
.... 
} 

static void (_func)(int p) 
{ 
.... 
} 

일반적으로 나는 괄호로 둘러싸인 그 기능은 (* _func) 등의 함수 포인터에 대한 '*'와 함께 사용됩니다 알고 있지만, 위의 코드 왜 함수의 선언에 괄호 기능을 포위 했습니까?

이 방법을 사용해야하는 이유가 있습니까?

+1

본인은 영어가 모국어가 아니지만 올바른 단어를 배우는 것이 좋습니다. 다음 기호는'()'를 "괄호"라고 부릅니다. –

+0

괄호와 관련된 정확한 단어를 알려 주신 Jonathon Reinhart에게 감사드립니다. – user2503838

+1

둘 이상의() 및 "괄호"에 대해 "괄호" – 0decimal0

답변

3

함수 이름 주위에 괄호를두면 같은 이름의 함수와 같은 매크로에 의해 '재정의'되지 않습니다.

예를 들어 함수가 매크로로 구현되는 경우도 있지만 실제 함수로 구현해야 할 수도 있습니다 (포인터를 얻을 수있는 한 가지 이유가 있음). 이 API의 구현자는 함수 이름 선언과 실제 함수 구현을 이름이 괄호로 묶여서 매크로 이름과 충돌하지 않도록 할 수 있습니다.

그런 다음 API 사용자는 어떤 이유로 매크로 대신 실제 함수를 사용하려는 경우 #undef _func을 사용하거나 매크로를 사용하지 않으려면 괄호로 묶은 함수 이름을 사용할 수 있다고 결정할 수 있습니다.

"라이브러리 함수의 사용"C99 7.1.4 바와 같이 헤더에 선언 된 함수는 또한 헤더에 정의 함수와 같은 매크로로서 구현 될 수있다

라이브러리 그렇다면 함수가 헤더가 포함되어있을 때 명시 적으로 선언 된 이면 아래에 표시된 기술 중 하나를 사용하여 같은 매크로의 영향을받지 않도록 할 수 있습니다. 함수의 매크로 정의는 매크로 함수 이름의 확장을 나타내는 왼쪽 괄호 다음에 나오지 않으므로 괄호 안에 함수 이름을 포함하여 로컬에서 을 억제 할 수 있습니다. 동일한 구문 론적 이유 때문에 도 매크로로 정의되어 있어도 라이브러리 함수의 주소를 가져올 수 있습니다. #undef를 사용하여 매크로 정의를 제거하면 실제 함수가 참조됩니다.

관련 문제