의 의미가 혼동 void *function()
됩니다.
함수에 대한 포인터 void*
입니까 아니면 함수를 반환 합니까? 나는 항상 포인터를 반환하는 재귀 함수로 데이터 구조에서 사용했지만 멀티 스레딩 ( pthread
) 의 코드를 볼 때 동일한 함수 선언이 있습니다. 이제는 차이점이 무엇인지 혼란 스럽습니다.
답변
이 함수에는 반환 유형이 void *
있습니다.
void *function();
그래서 나는 항상 그런 경우 *
처럼 기호 를 함수 이름과 분리하는 것을 선호합니다.
void * function();
로 그리고 Jarod42
댓글에서 지적 당신은 뒤에 반환 형식 등을 사용하여 C ++에서 함수 선언을 다시 작성할 수 있습니다
auto function() -> void *;
함수에 대한 포인터를 선언하려면 다음을 작성해야합니다.
void ( *function )();
또는
void * ( *function )();
또는 함수에 대한 포인터를 반환하는 함수에 대한 포인터
void * ( *( *function )() )();
답변
C 구문 문제가 확실하지 않을 때마다 cdecl 유틸리티 ( online version )를 사용하여 해석합니다. C 구문과 영어를 번역합니다.
예를 들어, 나는 당신의 예를 입력 void *foo()
하고 그것을 반환했습니다.
void에 대한 포인터를 반환하는 함수로 foo를 선언하십시오.
다른 구문이 어떻게 보이는지 확인하기 위해 입력 declare foo as pointer to function returning void
하고 반환했습니다.
무효 (* foo) ()
단일 식에 여러 수준의 유형 변환, 별 또는 괄호가있는 경우 특히 유용합니다.
답변
에 대한 포인터를 반환하는 함수입니다 void
입니다.
다음과 같이 선언을 생각하십시오.
void *(function());
이것은 다음을 반환하는 함수 void
이거나 아무것도 아닙니다.
void (*function2)();
위의 선언을 이런 식으로 생각하십시오.
void ((*function2)());
이것을 작성하는 훨씬 쉬운 방법은 typedef
s 를 사용하는 것입니다 .
typedef void *function_returning_void_pointer();
typedef void function_returning_nothing();
function_returning_void_pointer function;
function_returning_nothing *function2;
이것은 일반적으로 함수 포인터 주위의 혼란을 제거하고 훨씬 쉽게 읽을 수 있습니다.
답변
C / C ++의 선언은 연산자 우선 순위에 따라 식별자 외부에서 읽습니다 .
얼핏 위키 피 디아에서 C / C ++ 연산자 우선 순위 테이블은 함수 호출 연산자는 것을 알 ()
간접 연산자보다 더 높은 우선 순위를 갖습니다 *
. 따라서 함수 선언은 다음과 같습니다.
-
식별자에서 시작 :
function
is -
function()
인수를받지 않는 함수 -
void* function()
를 반환합니다void*
.
이 일반적인 원칙은 또한 배열 선언 ( []
보다도 우선 순위가 높음)과이 *
둘의 조합을 유지합니다. 그래서
int *(*arr[42])();
로 읽힌다
arr
이다arr[42]
42 개의 요소로 구성된 배열*arr[42]
에 대한 포인터(*arr[42])()
인수를 취하지 않는 함수int *(*arr[42])()
를 반환합니다int*
.
이것에 익숙해지기 위해서는 약간의 시간이 걸리지 만 일단 원리를 이해하면 해당 선언을 명확하게 읽을 수 있습니다.