programing

괄호가 "typedefint (f)(void)"인 typedef는 무엇을 의미합니까?기능 시제품입니까?

padding 2023. 11. 4. 10:17
반응형

괄호가 "typedefint (f)(void)"인 typedef는 무엇을 의미합니까?기능 시제품입니까?

typedef int (fc_name) (void);

여기서fc_name는 유효한 C 기호입니다.

함수 포인터와 얼마나 다른가요?typedef?

이거는.typedef함수형으로 변환합니다.함수 포인터에 사용하는 것이 목적이지만 이 경우 사용하는 구문은 다음과 같습니다.

int bar(void);

fc_name* foo = bar; /* Note the * */

업데이트: 조나단 레플러의 답변에 댓글로 언급된 바와 같이,typedef함수를 선언하는 데 사용할 수 있습니다.콜백 함수들의 집합을 선언하는 것이 하나의 용도가 될 수 있습니다.

typedef int (callback)(int, void*);

callback onFoo;
callback onBar;
callback onBaz;
callback onQux;

첫번째 괄호는 불필요하며 다음과 같습니다.

typedef int fc_name(void);

저는 이것이 유용하다고 생각하지 않지만, GCC가 그것에 대해 불평하도록 할 수는 없습니다.

이 말은fc_name는 인수를 사용하지 않고 반환하는 함수 유형의 별칭입니다.int. 예를 들어, 당신이 선언할 수 있지만, 그것은 직접적으로 그렇게 유용하지는 않습니다.rand()기능 사용:

fc_name rand;

사용할 수 없습니다.typedef함수 정의로

함수 유형 def에 대한 포인터는 다음과 같이 표시됩니다.

typedef int (*fc_name)(void);

이 코드는 별표가 없는 유형의 디프가 함수 포인터가 아님을 보여줍니다(지금은 삭제된 대체 답변을 가리킴).

static int function(void)
{
    return 0;
}

typedef int   fc_name1 (void);
typedef int  (fc_name2)(void);
typedef int (*fc_name3)(void);

fc_name1 x = function;
fc_name2 y = function;
fc_name3 z = function;

정리하면 'gcc'는 다음과 같이 말합니다.

gcc -Wextra -Wall -pedantic -c -O x.c
x.c:10:1: error: function ‘x’ is initialized like a variable
x.c:11:1: error: function ‘y’ is initialized like a variable

그리고 이 코드는 당신이 실제로 사용할 수 있다는 것을 보여줍니다.fc_name *var = funcname;제임스들린이 제안한 바와 같이

static int function(void)
{
    return 0;
}

typedef int   fc_name1 (void);
typedef int  (fc_name2)(void);
typedef int (*fc_name3)(void);

fc_name1  x_0 = function;
fc_name1 *x_1 = function;
fc_name2  y_0 = function;    // Damn Bessel functions - and no <math.h>
fc_name2 *y_1 = function;    // Damn Bessel functions - and no <math.h>
fc_name3  z   = function;

y0을 사용하여 y1은 GCC 경고를 생성합니다.

x.c:12:11: warning: conflicting types for built-in function ‘y0’
x.c:13:11: warning: built-in function ‘y1’ declared as non-function

그리고, 샷의 의견을 바탕으로:

static int function(void)
{
    return 0;
}

typedef int   fc_name1 (void);
typedef int  (fc_name2)(void);
typedef int (*fc_name3)(void);

fc_name1  x_0 = function;   // Error
fc_name1 *x_1 = function;   // x_1 is a pointer to function
fc_name1  x_2;              // Declare int x_2(void);
fc_name1 *x_3 = x_2;        // Declare x_3 initialized with x_2

fc_name2  y_0 = function;   // Damn Bessel functions - and no <math.h>
fc_name2 *y_1 = function;   // Damn Bessel functions - and no <math.h>
fc_name1  y_2;              // Declare int y_2(void);
fc_name1 *y_3 = x_2;        // Declare y_3 initialized with y_2

fc_name3  z   = function;

흥미로운 것은 C의 어두운 구석은 정말로 탁하다는 것입니다.

  1 #include <stdio.h>
  2 
  3 
  4 typedef int (fc_name)(void);
  5 
  6 
  7 
  8 int test_func1 ()
  9 {
 10     printf("\n test_func1 called\n");
 11 
 12     return 0;
 13 }
 14 
 15 int test_func2 (void)
 16 {
 17     printf("\n test_func2 called\n");
 18     return 0;
 19 }
 20 
 21 int handler_func(fc_name *fptr)
 22 {
 23     //Call the actual function
 24     fptr();
 25 }
 26 
 27 int main(void)
 28 {
 29     fc_name  *f1, *f2;
 30 
 31     f1 = test_func1;
 32     f2 = test_func2;
 33 
 34     handler_func(f1);
 35     handler_func(f2);
 36 
 37     printf("\n test complete\n");
 38 
 39     return 0;
 40 }

출력:-

 test_func1 called

 test_func2 called

 test complete

그래서 제가 질문한 type def (여기서 4번 줄)은 함수 유형을 나타내며 함수 포인터 유형 def와 같지 않습니다.이런 유형의 디프는 큰 의미가 없습니다.이것들은 스타일 표준으로 사용되거나 단순히 의도적으로 난독화를 만들기 위해 사용됩니다 ;-)

재미있네요!typedef 선언은 typedef를 저장 클래스로 하는 선언입니다.

typedef int   fc_name1 (void);   
// this defines a function type called fc_name1 
// which takes no parameter and returns int

나중에 다음과 같은 함수를 정의할 수 있습니다.

fc_name1 myFunc;
// this is equivalent to the next line
// int myFunc(void);

당신은 c/c++ 표준에서 이것을 알아낼 수 있을 것입니다!

나는 이것이 typedef 이름에 행해지는 것을 본 적이 없지만, 함수 이름 주변의 괄호는 함수가 같은 이름의 함수와 같은 매크로로 확장되는 것을 방지하는 데 유용합니다.예를 들면.isxxx에 있어서의 기능.ctype.h함수와 매크로로 정의됩니다.이렇게 하면 포인터를 사용하여isalpha. 그러나 C 라이브러리는 아웃오브라인을 어떻게 정의합니까?isalpha? 아마 다음과 같을 것입니다.

#include <ctype.h>

int
(isalpha)(int c)
{
    return isalpha(c);
}

의 사용.isalpha함수 본문은 매크로로 확장되지만 함수 헤더의 사용은 그렇지 않습니다.

정확한 양식은 다음과 같습니다.

typedef int (*myfunc)(void);

다음과 같이 함수를 정의할 수 있습니다.

int helloword(void) {
    printf("hello, world\n");
}

그런 다음 이 함수에 대한 변수 점을 정의합니다.

myfunc hw_func;
hw_func = helloworld;

함수 포인터로 함수를 호출합니다.

int ret = (*hw_func)();

함수 포인터가 필요한 이유는 C언어에 미리 정의된 함수 포인터가 없기 때문입니다.void *함수를 호출하는 포인터는 C 언어에서 불법입니다.

언급URL : https://stackoverflow.com/questions/3674200/what-does-a-typedef-with-parenthesis-like-typedef-int-fvoid-mean-is-it-a

반응형