void *function()은 기능에 대한 포인터입니까 아니면 void를 반환하는 함수입니까?
나는 그것의 의미에 대해 혼란스럽습니다.void *function()
.
기능에 대한 포인터입니까, 아니면 기능을 반환하는 것입니까?void*
? 포인터를 반환하는 재귀 함수로 항상 데이터 구조에 사용했지만 멀티스레딩에서 코드를 봤을 때 (pthread
) 동일한 함수 선언이 있습니다.지금 저는 그들의 차이점이 무엇인지 혼란스럽습니다.
함수에 반환 유형이 있습니다.void *
.
void *function();
그래서 나는 항상 그런 경우에는 기호를 구분하는 것을 선호합니다.*
등의 함수명에서
void * function();
그리고.Jarod42
코멘트에서 가리키는 당신은 C++의 함수 선언을 다음과 같이 후행 반환 유형을 사용하여 다시 쓸 수 있습니다.
auto function() -> void *;
기능하도록 포인터를 선언하려면 다음과 같이 써야 합니다.
void ( *function )();
반환 유형은 다음과 같습니다.void
아니면
void * ( *function )();
여기서 반환 유형void *
.
또는 포인터를 함수로 되돌리는 함수의 포인터
void * ( *( *function )() )();
C 구문 문제에 대해 확신이 서지 않을 때마다 cdecl 유틸리티(온라인 버전)를 사용하여 통역해 주는 것을 좋아합니다.이것은 C 구문과 영어 사이에서 번역합니다.
예를 들어, 나는 당신의 예를 입력합니다.void *foo()
그리고 돌아왔습니다.
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
가function()
논변이 필요 없는 함수void* function()
그리고 a를 반환합니다.void*
.
이 일반적인 원리는 배열 선언에도 적용됩니다.[]
또한 보다 높은 우선 순위를 가집니다.*
)와 둘의 조합. 그래서.
int *(*arr[42])();
로 읽힙니다.
arr
arr[42]
, 즉 42개의열들.*arr[42]
의 지시(*arr[42])()
하지 않는 및int *(*arr[42])()
답례하다, 답례하다, 답례하다, 답례하다, 답례하다int*
.
이에 익숙해지려면 다소 시간이 걸리지만, 일단 원리를 이해하고 나면 그 선언문들을 명확하게 읽기 쉽습니다.
언급URL : https://stackoverflow.com/questions/58500806/is-void-function-a-pointer-to-function-or-a-function-returning-a-void
'itsource' 카테고리의 다른 글
var, let 또는 construct 없이 객체 파괴 (0) | 2023.10.19 |
---|---|
VBA Editor를 초기 설정으로 복원하는 방법은 무엇입니까? (0) | 2023.10.19 |
단일 MariaDB를 Galera 클러스터로 변환 (0) | 2023.10.14 |
-no-pie는 무엇에 사용됩니까? (0) | 2023.10.14 |
전체 정수에서 각 개별 숫자 가져오기 (0) | 2023.10.14 |