괄호가 "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
'programing' 카테고리의 다른 글
Hi/Lo 알고리즘이란? (0) | 2023.11.04 |
---|---|
ORA-12557 TNS: 프로토콜 어댑터를 로드할 수 없음 (0) | 2023.11.04 |
자바스크립트로 소리 알림 재생? (0) | 2023.11.04 |
jQuery를 사용하지 않는 경험적인 기술적 이유는 무엇입니까? (0) | 2023.11.04 |
파워셸에서 @()의 의미는 무엇입니까? (0) | 2023.10.30 |