아래와 같은 문제를 보았어요.
#include <stdio.h>
#include <math.h>
#define PI 3.14159
typedef double dbl;
typedef dbl (*PFDD)(dbl);
int main(void)
{
PFDD f = sin, g = cos;
printf("f(%f) = %f\n", PI, f(PI));
printf("g(%f) = %f\n", PI, g(PI));
return 0;
}
typedef dbl FDD(dbl);
typedef FDD *PFDD;
함수 포인터 형에 대한 typedef는 알고 있었는데, * 없이 FDD(dbl) 형태로 선언한 경우는 어떤 자료형으로 선언한 것인가? 싶어서 구글링을 좀 해봤어요.
StackOverflow의 비슷한 사례의 질문글을 찾았어요.
typedef dbl FDD(dbl);
typedef FDD *PFDD;
위 두 줄의 코드는 기존에 PFDD를 바로 함수 포인터 형으로 선언한 것을 둘로 나눠서,
FDD라는 함수 자체의 자료형을 만든 뒤 PFDD를 FDD의 포인터 형으로 선언한 것으로 이해할 수 있어요.
typedef double double_f(double);
위와 같이 double_f를 typedef로 선언하면, double형 인자 1개를 받아 double형 값을 반환하는 함수 자체에 대한 자료형을 선언할 수 있어요.
이후에, 아래와 같이 사용할 수 있어요.
doulbe sin(double);
double_f *fp = sin;