programing

함수 반환 자체

powerit 2023. 9. 10. 13:10
반응형

함수 반환 자체

유형 을 할 할 을 선언할 수 있습니까?func_t유형을 그을는지지는ht을,s그func_t?

즉, 함수가 스스로 돌아오는 것이 가능한 것일까요?

// func_t is declared as some sort of function pointer
func_t foo(void *arg)
{
  return &foo;
}

아니면 내가 사용해야 할까요?void *그리고 타입캐스팅?

아니요. C에서는 재귀 함수 유형을 선언할 수 없습니다.구조(또는 조합) 내부를 제외하고는 C에서 재귀형을 선언할 수 없습니다.

.void *책,void *는 객체에 대한 포인터만 보유하고 함수에 대한 포인터는 보유하지 않습니다.수 있는 것과수는과할를수과nt는gvoid *는 확장자로만 사용할 수 있습니다.

가능한 구조의 해결책은 다음과 같습니다.

struct func_wrap
{
    struct func_wrap (*func)(void);
};

struct func_wrap func_test(void)
{
    struct func_wrap self;

    self.func = func_test;
    return self;
}

으로 gcc -Wall경고는 하지 않았지만 100% 휴대용인지는 잘 모르겠습니다.

함수 포인터를 다음에 캐스트할 수 없습니다.void*(크기가 다를 수 있음) 하지만 다른 함수 포인터 유형으로 캐스트한 후 원래 값을 얻기 위해 다시 캐스트할 수 있으므로 문제가 되지 않습니다.

typedef void (*fun2)();
typedef fun2 (*fun1)();

fun2 rec_fun()
{
    puts("Called a function");
    return (fun2)rec_fun;
}

// later in code...
fun1 fp = (fun1)((fun1)rec_fun())();
fp();

출력:

Called a function
Called a function
Called a function

즉, 함수가 스스로 돌아오는 것이 가능한 것일까요?

그것은 "자체"를 의미하는 것에 따라 다릅니다. 만약 여러분이 스스로를 가리키는 포인터를 의미한다면, 대답은 "네"입니다!함수가 자신의 유형을 반환할 수는 없지만 함수는 자신에게 포인터를 반환할 수 있으며 호출 전에 이 포인터를 적절한 유형으로 변환할 수 있습니다.

자세한 내용은 comp.lang.c FAQ: 포인터를 동일한 유형의 함수로 반환할 수 있는 함수라는 질문에 설명되어 있습니다.

자세한 내용은 제 답변을 확인하세요.

함수 정의를 가정합니다.

T f(void)
{
  return &f;
}

f()형을다합니다.T, 하지만 그 표현의 종류는&f를 되돌리는 데 됩니다."은다을r다은"s는g .T 가 가 T 식이다,현는현&f항상 다른 호환되지 않는 유형일 것입니다.T (*)(void).라 할지라도T는과은터대수다수ses대 등의 포인터 대 타입입니다.Q (*)(void), , , 의 표현&f "의 결합 "기능간의 결합", "기능간의 결합", "기능간의 결합", "기능간의 결합",Q (*(*)(void))(void).

한다면T는 함수 포인터 과 변환을 저장할 수 있을 만큼 충분히 큰 통합형입니다.T (*)(void)T그리고 다시T (*)(void)당신의 플랫폼에서 의미가 있습니다. 당신은 다음과 같은 것을 피할 수 있을지도 모릅니다.

T f(void)
{ 
  return (T) &f;
}

적어도 몇 가지 상황은 생각해 볼 수 있어요 전혀 효과가 없을 거예요그리고 솔직히, 그것의 효용성은 룩업 테이블과 같은 것을 사용하는 것에 비해 매우 제한적일 것입니다.

C는 다른 데이터 항목처럼 함수를 처리하도록 설계되지 않았으며 함수에 대한 포인터는 객체 유형에 대한 포인터와 교환할 수 없습니다.

이와 같은 것은 어떻습니까?

typedef void* (*takesDoubleReturnsVoidPtr)(double);

void* functionB(double d)
{
    printf("here is a function %f",d);
    return NULL;
}

takesDoubleReturnsVoidPtr functionA()
{
    return functionB;
}

int main(int argc, const char * argv[])
{
    takesDoubleReturnsVoidPtr func = functionA();
    func(56.7);
    return 0;
}
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

typedef void *(*fptr)(int *);
void *start (int *);
void *stop (int *);
void *start (int *a) {
         printf("%s\n", __func__);
         return stop(a);
}
void *stop (int *a) {
         printf("%s\n", __func__);
         return start(a);
}
int main (void) {
         int a = 10;
         fptr f = start;
         f(&a);
         return 0;
}

함수가 값별로 반환되는 것은 불가능합니다.그러나 포인터에 의해 되돌아오는 은 그 자체로 가능합니다.

C를 사용하면 정의되지 않은 수의 매개 변수를 사용하는 함수 유형을 정의할 수 있으며 이러한 유형은 정의된 매개 변수를 사용하는 함수 유형과 호환됩니다.

예를 들어,

typedef void fun_t();

void foo(int);
fun_t *fun = foo; // types are fine

따라서 다음과 같은 기능이 작동합니다.

void fun(void (**ptr)()) {
    *ptr = &fun;
}

아래에서 예시적인 사용법을 확인할 수 있습니다.

#include <stdio.h>

void fun(void (**ptr)()) {
    puts("fun() called");
    *ptr = &fun;
}

int main() {
    void (*fp)();
    fun(&fp); /* call fun directly */
    fp(&fp);  /* call fun indirectly */
    return 0;
}

이 코드는 C89 표준에 대한 경고 없이 현학적 모드로 컴파일됩니다.예상되는 출력을 생성합니다.

fun() called
fun() called

방법이 있어요, 그냥 이걸 시도해보세요.

typedef void *(*FuncPtr)();

void *f() { return f; }

int main() {
    FuncPtr f1 = f();
    FuncPtr f2 = f1();
    FuncPtr f3 = f2();
    return 0;
}

C++를 사용하는 경우,State개체 유형(상태 시스템 예제 사용 가정)을 선언합니다.operator()A를 반환하는State참조 또는 포인터별 개체 유형.그런 다음 각 상태를 의 파생 클래스로 정의할 수 있습니다.State각각의 적절한 다른 파생된 유형을 반환하는 것.operator().

언급URL : https://stackoverflow.com/questions/17536504/function-returning-itself

반응형