스티븐 아저씨책 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를 할당하거나 함수로 전달할 때 포인터 타입이 맞지 않는다는 워닝을 발생시킵니다.
대신 해당함수의 파라메터 체크등은 바랄 수 없겠죠.
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
Re: #define SIG_ERR (void (*)()) -1 해석이 ...
void (*)() 는 void (*)(void) 와 같지 않아요.
파라메터 지정하는 곳에 아무것도 없다는 것은 (void라는 것도 없는 경우)
그 함수의 파라메터가 정해지지 않았다는 것이거든요.
void (*)()는
void (*)(char *)
void (*)(int)
void (*)(int, int)
등 어떤 파라메터 형식과도 호환(?)이 됩니다.
void (*)(void) 라고 쓰면
void (*)(void) 하고만 쓸 수 있고, 시그널쪽에서는
void (*)(int)를 요구하기 때문에, 당연히 SIG_ERR를 할당하거나
함수로 전달할 때 포인터 타입이 맞지 않는다는 워닝을 발생시킵니다.
대신 해당함수의 파라메터 체크등은 바랄 수 없겠죠.
댓글 달기