#define SIG_ERR (void (*)()) -1 해석이 ...

익명 사용자의 이미지

스티븐 아저씨책 272p ( 10.signal )에 보면
#define SIG_ERR (void (*)())-1
이렇게 되어있는데요.

캐스트연산자 속에
void (*)()
이 ----------> void (*)(int) 로 바껴야되는것 아닌가요?
책표현대로라면 signal 핸들러함수원형이
void (*)(void)란 말 같은데...요.
설명좀 부탁드려요.

익명 사용자의 이미지


void (*)() 는 void (*)(void) 와 같지 않아요.
파라메터 지정하는 곳에 아무것도 없다는 것은 (void라는 것도 없는 경우)
그 함수의 파라메터가 정해지지 않았다는 것이거든요.
void (*)()는

void (*)(char *)
void (*)(int)
void (*)(int, int)

등 어떤 파라메터 형식과도 호환(?)이 됩니다.

void (*)(void) 라고 쓰면
void (*)(void) 하고만 쓸 수 있고, 시그널쪽에서는
void (*)(int)를 요구하기 때문에, 당연히 SIG_ERR를 할당하거나
함수로 전달할 때 포인터 타입이 맞지 않는다는 워닝을 발생시킵니다.

대신 해당함수의 파라메터 체크등은 바랄 수 없겠죠.