C에서 아무런 동작도 하지 않는 라인을 만들때 어떤 방법을 쓰는게 좋은가요?
글쓴이: superkkt / 작성시간: 목, 2006/11/02 - 9:21오전
#include <stdio.h> int main(void) { int i = 1; if (i == 1) printf("1\n"); else ; /* do nothing */ return 0; }
위 코드에서 else 부분에서 아무런 동작도 하지 않게하기위해 어떤 방법을 쓰는게 좋은가요? 일단 위와 같이 세미콜론 하나만 사용하니 별다른 경고는 안나오네요. 전에는 (void *) 0;를 사용했는데 이건 경고가 나오더라구요.
Forums:
아무런 동작도 안
아무런 동작도 안 하게 하려면 아무 것도 안 쓰면 됩니다. 위의 예에서 아예 else 도 쓰지 않고 ; 도 쓰지 않으면 되죠.
그리고 if 또는 else 조건 안에 한 줄만 있으면 { } 생략해도 되긴 합니다만 두 줄 이상이 들어갈 때는 { } 를 꼭 써야 합니다. 위의 예에서는 { } 쓰나 마나 마찬가지이지만 프로그램 수정 과정에서 if 또는 else 안에 내용을 더 넣고 { } 안 쓰면 나중에 찾기 어려운 에러가 날 수 있습니다.
http://sebul.sarang.net/
세벌 https://sebuls.blogspot.kr/
저는 개인적으로
저는 개인적으로 괄호를 사용합니다.
쓰고나니 세벌님과 같네요.
> 전에는 (void *) 0;를
> 전에는 (void *) 0;를 사용했는데 이건 경고가 나오더라구요.
>
(void) 0;
을 의도하신 것 아닐까요?
(void *) 0
의 경우 void * 형의 null pointer 를 만들기에 이 값이 사용되지
않고 무시된다는 경고를 받게 될 가능성이 큽니다.
장난 좀 치려면
(void) "월급 좀 올려주삼";
(void) "야근 좀 줄여주삼";
과 같은 센스도 --;;;;;
if 문의 then 이나 else 파트의 문장이 단문일 경우 {} 를 써주느냐의
문제는 스타일의 문제입니다. 전사나 팀 차원의 스타일 가이드가 있다면
따라야겠으나 개인적인 프로그램의 경우 자기 스타일대로 해도 무방
하다고 봅니다.
개인적으로는 단문일 경우 {} 를 써주지 않는 것을 (경험상 가독성에서
더 유리해) 선호합니다.
--
Jun, Woong (woong at icu.ac.kr)
Web: http://www.woong.org
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
(void) 0; 맞습니다.
(void) 0;
맞습니다. 이거 쓸라고 했던건데 (void *) 0;으로 햇갈렸네요. 전웅님 책에서 본 기억이 있는것 같은데 지금 책이 없어서..^^
그리고 저도 if/else 문에서 단문일 경우에 원래는 괄호를 사용했었는데 쓰지 않는것이 가독성 향상에 도움이 된다고 느껴서 요즘은 일부러 빼고 사용합니다.
======================
BLOG : http://superkkt.com
======================
BLOG : http://superkkt.com
풉...
글 보다가 커피가 코로 나왔습니다. ^*^;;;;
====
( - -)a 이제는 학생으로 가장한 백수가 아닌 진짜 백수가 되어야겠다.
궁금해서
수행되지 않으면서,
수행되지 않으면서, 경고도 안 뜨고, 메모리 좀 적게 잡아먹고, 가독성이 *가장* 좋은 코드를 찾는 과정이겠죠...
그리고 보통 세미콜론만 쓰게 되는 경우가 소스 수정하다가 어쩌다 보니 임시로 만들게 되는 과정이 대부분이니, 짧게 쓸 수 있는 게 번거롭지 않겠죠..
요런거...
요런거... 조심해야 합니다...
;만 쓰시다 보면.. 요렇게 잘못쓴 경우... 버그찾기 정말 짜증납니다... ;가 눈에도 잘 안보이고 해서... functionb()는 항상 호출되죠..
매크로는 어떨까요?
#define DO_NOTHING ;
위와 같은 매크로를 정의해서 사용하면 수행되지 않으면서, 경고도 안 뜨고, 메모리 좀 적게 잡아먹고, 가독성이 좋은 코드에 가깝지 않을까요??
do { }
do { } while(0);
컴파일러가 코드를 최적화 하는 과정에서 조용히 날라갈 코드입니다 ;)
-----
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
전이렇게
전이렇게 하는데..ㅡ,.ㅡ;;
----------------------------------------------------------------------------
한가지 기억할
한가지 기억할 사실은
자체가 exp 가 거짓일 때는 "아무 것도 수행을 안 한다"는 것입니다 - 이미
세벌님이 이 부분을 지적하셨죠.
따라서 null statement 를 포함하는 else 부분이 필요한 경우는 특별히
주석을 달아주는 경우 뿐인데, 이 경우라면 ; 만 적어주어도 주석과 같은
줄에 있다면 못보고 넘어 가거나 잘못 수정할 확률이 크게 줄게 됩니다.
null statement 가 필요한 또 다른 문맥 중 하나는 필요한 side effect 가
모두 loop 의 conditional expression 안에서 끝나 loop body 가 할 일이
없기 때문에 loop body 를 비워주는 경우입니다.
보통 이와 같은 경우에도 ; 를 독립된 줄에 써 혹시나 발생할지 모르는
가독성 문제를 방지하거나 혹은 다음과 같이 무의미한 continue 문을 써
주기도 합니다 - continue 문이 유용한 경우 중 하나입니다.
하지만, 이와 같은 방식이 모두 맘에 들지 않는 경우 애초부터 loop body
가 반드시 loop 의 main side effect 를 포함해야 한다는 가이드라인을
따르면 됩니다.
그 외에 위에서 나온 null statement 를 가독성을 위해 어떻게 표현할 것
인가는 역시나 스타일 문제에 불과합니다.
단,
의 경우 습관상
과 같이 쓰기 쉬우므로 (중첩된 if-else 문을 생각해 보시기 바랍니다)
차라리
으로 정의하는게 나을 것 같습니다.
또한,
과 같은 형태는 유의미한 side effect 를 포함하지 않는 문장이기에 최적화
과정에서 깔끔하게 사라지는 것이 일반적입니다 (단, 제가 만든 토이
컴파일러에서는 지워주지 않습니다 ;-). 따라서 "메모리"에 대한 걱정이
있을 필요는 없습니다.
--
Jun, Woong (woong at icu.ac.kr)
Web: http://www.woong.org
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
if (0) 0; else
$ruby.is_a?(Object){|oriented| language} #=> true
http://rubykr.org
----
http://nohmad.tumblr.com/
1; 에 한표. 삽질의
1; 에 한표.
삽질의 대마왕...
삽질의 대마왕...
...
코딩 하다가 문득 주석 처리해야 되겠다고 생각된 부분이 있는데,
그게 조건문의 유일한 실행문이면...
;
하나로 처리하기엔 좀 걸리죠.. 워닝 뜨고 나중에 오타 칠 가능성도 좀 있고...
그렇다고 그런 일 있을 때마다 일일이 define 문 선언해 주는 것도 좀 그렇고요요..;
true나 false를 써주는 것도 나아 보입니다.
if (1)
true;
else
false;
if (b)
NULL == NULL;
else
NULL != NULL;
의미 좀 부여해 주면서 나중에 수정할 부분이란 걸 나타낼 수도 있지 않을까요?
> 코딩 하다가 문득
> 코딩 하다가 문득 주석 처리해야 되겠다고 생각된 부분이 있는데,
> 그게 조건문의 유일한 실행문이면...
> ;
> 하나로 처리하기엔 좀 걸리죠.. 워닝 뜨고 나중에 오타 칠 가능성도 좀 있고...
; 는 null statement 라는 전통적인 이름도 가지고 있습니다. 그만큼
오래된 사용처를 갖는 방법입니다. 예를 들어, goto 문을 위한 label 은
항상 문장에 붙도록 되어 있습니다. 하지만, goto 로 이동하려는 지점이
블록의 마지막 부분이라면 label 이 붙을 문장이 없게 됩니다. 이런 경우
와 같이 작성하는 것은 오래된 관례입니다 - 아마도 거의 모든 C 언어
책에서 이를 설명하고 있으리라 생각합니다. 그럼에도 null statement 자체
에 경고를 내는 컴파일러가 매우 바람직하다고 보기는 어렵습니다. 더구나
null statement 에 경고를 내는 컴파일러가 1; 이나 0; 같은 부분에 경고를
내지 않는 것도 일관적으로 보이지 않습니다.
꼭 경고를 내야 한다면, null statement 혹은 그와 유사한 형태의 무의미한
문장이 반복문이나 if, else 문과 동일한 줄에 오는 경우에 경고를 내주면
사소한 실수를 피하는데 도움을 줄 수 있지 않을까 생각합니다. (물론,
이는 모두 QoI issue 이긴 합니다.)
> 그렇다고 그런 일 있을 때마다 일일이 define 문 선언해 주는 것도 좀 그렇고요요..;
> true나 false를 써주는 것도 나아 보입니다.
C 언어(C99 이전)에서는 true/false 를 위한 #define 선언이 결국은 또
필요하게 됩니다. 스타일 이야기가 나오고 있으므로 제가 선호하는 스타일을
말씀드리면, C 언어에서는 (C99 환경이 아닌 이상) 절대
true/false/TRUE/FALSE 등을 enum 이나 매크로로 정의하지 않는 것입니다.
이로 인한 문제를 겪어 보신 분들은 사소한 문제가 얼마나 사람을 성가시게
할 수 있는지 이해하실 겁니다.
> if (b)
> NULL == NULL;
> else
> NULL != NULL;
>
> 의미 좀 부여해 주면서 나중에 수정할 부분이란 걸 나타낼 수도 있지 않을까요?
역시나 *제* 스타일에서는 주석이 해야 할 일입니다.
--
Jun, Woong (woong at icu.ac.kr)
Web: http://www.woong.org
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
else 구문에 compound statement를 사용합니다.
전 아래와 같이 사용합니다. 주석은 혼동을 피하기 위해서 사용합니다.
while (0) 이걸
이걸 적당한 메크로로 싸시면 안전하게 사용하실 수 있습니다.
이디에 박아나두 별다른 문제 없습니다.
이게 NOP 정도나 될려나.
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <beer.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
[꼬진 인터넷 땜에
[꼬진 인터넷 땜에 중복 투고되어 하나 날립니다]
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
사용자가 실수를
사용자가 실수를 하면 안전하지 않습니다.
사용자가 절대 실수를 하지 않는다면? 그렇다면 굳이 잘 보이게 매크로로
정의할 일도 없겠지요.
--
Jun, Woong (woong at icu.ac.kr)
Web: http://www.woong.org
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
댓글 달기