void * function ()은 함수에 대한 포인터 또는 void *를 반환하는 함수입니까?


26

의 의미가 혼동 void *function()됩니다.
함수에 대한 포인터 void*입니까 아니면 함수를 반환 합니까? 나는 항상 포인터를 반환하는 재귀 함수로 데이터 구조에서 사용했지만 멀티 스레딩 ( pthread) 의 코드를 볼 때 동일한 함수 선언이 있습니다. 이제는 차이점이 무엇인지 혼란 스럽습니다.


5
@goodvibration C는 포맷이없는 상태로 만들어졌습니다 (그리고 C ++은 이것을 "상속"했습니다). 심지어 void*function();문법적으로 정확합니다. 예를 들어 Python의 경우 다른 결정을 선택했습니다. 형식은 구문의 일부입니다. IMHO, 두 가지 방법 모두 장단점이 있습니다.
Scheff

3
@goodvibration 더 많은 것을 원한다면 프로그래머가 자바와 같은 것을 얻지 못하도록 보호하려고 노력할 것이다.)
idclev 463035818

2
@goodvibration 적은 옵션, 적은 유연성. 그리고 수십 년 전에 그들이 그 일을했다는 것을 명심하십시오. 나중에 불평하기 쉽다 ... ;-)
Scheff

2
C 언어에서, void *function()임의의 수의 인수를 사용하여 역 참조 될 때 void 유형 인 값을 리턴하는 함수 입니다. C ++에서 void* function()인수를 사용하지 않고 pointer-to-void 값을 반환하는 함수 입니다. 당신은 당신이 요구하는 언어를 생각해야합니다.
Stephen M. Webb

1
@ StephenM.Webb a를 역 참조 할 수 없습니다void * . 결국, 당신이 할 수 있더라도, 당신은 무엇을 할 것 void입니까?
Fabio는 Reinstate Monica

답변:


38

이 함수에는 반환 유형이 void *있습니다.

void *function();

그래서 나는 항상 그런 경우 *처럼 기호 를 함수 이름과 분리하는 것을 선호합니다.

void * function();

로 그리고 Jarod42댓글에서 지적 당신은 뒤에 반환 형식 등을 사용하여 C ++에서 함수 선언을 다시 작성할 수 있습니다

auto function() -> void *;

함수에 대한 포인터를 선언하려면 다음을 작성해야합니다.

void ( *function )();

또는

void * ( *function )();

또는 함수에 대한 포인터를 반환하는 함수에 대한 포인터

void * ( *( *function )() )();

2
그렇기 때문에 글쓰기를 선호합니다 void* function();. 그것은 유혹적이지 않다 ... ;-) (편집은 이것을 쓰는 동안 일어났다.)
Scheff

코드 void * reader();에서 pthread_create(&thread1,null,reader,reader_arg)대신 다음 대신 선언pthread_create(&thread1,null,&reader,reader_arg)
user9515151

1
@Scheff : 또는 심지어 auto function() -> void*(C ++). :)
Jarod42.

3
또는 함수에 대한 포인터를 반환하는 함수에 대한 포인터 그것은 무엇 typedef을위한 것 입니다 ... ;-)
Andrew Henle

1
@AndrewHenle typedef를 사용하면 아무런 문제가 없습니다. 선언이 typedef 또는 별명 선언없이 사용될 때 문제가 발생합니다. :)
Vlad from Moscow

7

C 구문 문제가 확실하지 않을 때마다 cdecl 유틸리티 ( online version )를 사용하여 해석합니다. C 구문과 영어를 번역합니다.

예를 들어, 나는 당신의 예를 입력 void *foo()하고 그것을 반환했습니다.

void에 대한 포인터를 반환하는 함수로 foo를 선언하십시오.

다른 구문이 어떻게 보이는지 확인하기 위해 입력 declare foo as pointer to function returning void하고 반환했습니다.

무효 (* foo) ()

단일 식에 여러 수준의 유형 변환, 별 또는 괄호가있는 경우 특히 유용합니다.


2

에 대한 포인터를 반환하는 함수입니다 void 입니다.

다음과 같이 선언을 생각하십시오.

void *(function());

이것은 다음을 반환하는 함수 void이거나 아무것도 아닙니다.

void (*function2)();

위의 선언을 이런 식으로 생각하십시오.

void ((*function2)());

이것을 작성하는 훨씬 쉬운 방법은 typedefs 를 사용하는 것입니다 .

typedef void *function_returning_void_pointer();
typedef void function_returning_nothing();

function_returning_void_pointer function;
function_returning_nothing *function2;

이것은 일반적으로 함수 포인터 주위의 혼란을 제거하고 훨씬 쉽게 읽을 수 있습니다.


0

C / C ++의 선언은 연산자 우선 순위에 따라 식별자 외부에서 읽습니다 .

얼핏 위키 피 디아에서 C / C ++ 연산자 우선 순위 테이블은 함수 호출 연산자는 것을 알 ()간접 연산자보다 더 높은 우선 순위를 갖습니다 *. 따라서 함수 선언은 다음과 같습니다.

  • 식별자에서 시작 : functionis

  • function() 인수를받지 않는 함수

  • void* function()를 반환합니다 void*.

이 일반적인 원칙은 또한 배열 선언 ( []보다도 우선 순위가 높음)과이 *둘의 조합을 유지합니다. 그래서

int *(*arr[42])();

로 읽힌다

  • arr 이다
  • arr[42] 42 개의 요소로 구성된 배열
  • *arr[42] 에 대한 포인터
  • (*arr[42])() 인수를 취하지 않는 함수
  • int *(*arr[42])()를 반환합니다 int*.

이것에 익숙해지기 위해서는 약간의 시간이 걸리지 만 일단 원리를 이해하면 해당 선언을 명확하게 읽을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.