C: 이름없는 임시 변수 만들기
프로그래밍을 하다보면 때때로 임시 변수가 필요할 때가 있다. 특히 어떤 함수를 호출할 때 어쩔 수 없이 넘겨야 하는 포인터 인자 때문에 변수가 필요한 경우가 있다.
예를 들어, 어떤 디스크립터가 소켓인지 아닌지 판단하기 위해 getsockopt() 를 쓰는 경우가 있다. getsockopt() 의 원형은 다음과 같다.
소켓 여부를 판단하기 위해서는 socket 과 level 그리고 optname이 필요하지만, optval 이나 optlen 은 실질적으로 필요하지 않다. 일반적인 경우라면 다음과 같은 형태의 코드가 펼쳐질 것이다.
하지만 optval 이나 optlen 은 일회성 변수이므로, 다음과 같이 쓸 수 있다.
이러한 문법은 C99 이후에 지원되는 것으로 compound literals 라 불린다. C99 을 지원하는 컴파일러라면 일회성 임시 변수대신에 compound literals 를 사용하는 것이 더 편할 것 같다.
물론 compound literals 의 용도는 더 다양하다. 이에 대한 자세한 내용은 다음 링크를 참조하기 바란다.
예를 들어, 어떤 디스크립터가 소켓인지 아닌지 판단하기 위해 getsockopt() 를 쓰는 경우가 있다. getsockopt() 의 원형은 다음과 같다.
int getsockopt(int socket, int level, int optname,
void *optval, socklen_t *optlen);
소켓 여부를 판단하기 위해서는 socket 과 level 그리고 optname이 필요하지만, optval 이나 optlen 은 실질적으로 필요하지 않다. 일반적인 경우라면 다음과 같은 형태의 코드가 펼쳐질 것이다.
1 2 3 4 5 6 7 8 9 10 | { int sock; int optval = 0; int optlen = sizeof( optval ); if( getsockopt( sock, SOL_SOCKET, SO_TYPE, &optval, &optlen ) == ENOTSOCK ) { /* Not a socket */ } } |
하지만 optval 이나 optlen 은 일회성 변수이므로, 다음과 같이 쓸 수 있다.
1 2 3 4 5 6 7 8 | { int sock; if( getsockopt( sock, SOL_SOCKET, SO_TYPE, &( int ){ 0 }, &( int ){ sizeof( int )}) == ENOTSOCK ) { /* Not a socket */ } } |
이러한 문법은 C99 이후에 지원되는 것으로 compound literals 라 불린다. C99 을 지원하는 컴파일러라면 일회성 임시 변수대신에 compound literals 를 사용하는 것이 더 편할 것 같다.
물론 compound literals 의 용도는 더 다양하다. 이에 대한 자세한 내용은 다음 링크를 참조하기 바란다.
- https://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.html
- http://en.cppreference.com/w/c/language/compound_literal
댓글
댓글 쓰기