Warning treated as error & STL Work-IT



0. 변명...?
사실 문법에 크게 신경쓰는 편은 아닙니다. 무엇이 표준에 맞나 하는 문제는 그냥 C++ FAQ 나 인터넷에서 줏어들은 걸 하나씩 적용하는 정도지, 표준문서 뒤지고 이러지는 않습니다. 근처에도 표준문서 뒤지는 사람의 빈도가 꽤나 낮은걸 보면, 귀찮음의 레벨은 다들 비슷한 모양입니다. 뭐 그래도 개발자인지라 Daily Tip 해서 표준에서 위반하기 쉬운/표준을 따라서 더 편해지는 예제를 알려주는 곳이 있으면 그건 잘 챙겨볼걸요. (아마 다른분들도요..)

그런의미에서 '컴파일이 된다 / 안된다' 로 제대로 짠 코드인지 확인하려 한것은, 제가 모르는 표준이 있어서 저런 이상한게 새로운 의미를 지니는 건가 하고 확인해보는 차원이지, compile 여부를 제대로 된 코드인지 확인하려는 용도로 쓰려는 뜻은 아니었습니다. 아마 char* dim = {1,2,3} 이 제대로 warning 없이 컴파일이 되었다면 저는 이런 syntax 가 새로 생겼구나 하고 찾아봤겠죠. 거꾸로 C99 으로 컴파일 해봤어도 저런 warning 을 봤으면 "Warning 을 그냥 넘기면 안되는 이유" 에 대해서 장문의 예제를 첨부하긴 했겠지만요.

그래서 하는 말입니다만,


1. Warning 은 무시해도 되는가?
글세요.. 평소에도 개발할때 assert 를 자주 쓰는 편입니다.
개인적으로 가장 무서운 프로그램은 픽 죽어버리는 프로그램이 아니라 잘 도는척 하다가 뒤통수 때리는 프로그램입니다. 어디서 문제가 났는지도 모르고, 이 문제를 해결하려면 '무엇을 어떻게 얼만큼' 해야 하는지 아무런 정보도 알 수 없습니다.

그러나 다행히도, 몇몇 warning 들은 일주일짜리 여름 휴가를 떠난 팀원이 휴가 전에 커밋하고 나간 코드에 있는 이상한 버그를, 회사 컴퓨터를 부수기 전에 잡을수 있게 도와줍니다. 사실 예제로 들어주신 compile 결과에서 나온 warning 은 처음봅니다만, 저런 류의 warning 이라면 error 보다 악질적이라 compile 안되는 문제보다 더 나쁜놈으로 취급하고 고쳐야 한다고 생각합니다. 개발자는 오 일단 컴파일 되네~ 하고 넘겨버릴수 있기도 하고, 기계적으로 error 를 없에는 것에 비하면 routine 을 생각하면서 수정해야 하는 경우가 많거든요.

그래서 개인적으로 무슨일이 있어도 남기지 않는 warning 몇개를 정리해봤습니다.
(개인적으로 deprecated message 와 security enhance routine 관련 warning 은 무시하는 편인데, 이건 다음에 이야기 하기로 하겠습니다.)

C4700 : uninitialized local variable 'name' used
C4701 : Potentially uninitialized local variable 'name' used
C4704 : unreachable code
C4706 : assignment within conditional expression

.....
적당히 적어보다가 너무 많아서 스킵합니다. ㅠㅠ


2. STL? or?
사실 원글에서 말하고자 했던건 C 였지 C++ 은 아니었습니다. visual studio 에서 console program 을 만들면 main 을 cpp 로 만들어줘서 그런거지 C++ 에 대해 이야기 하려고 했던건 아니였거든요 :)

그리고 원글에서 언급하지 않은 fixed constant fixed constant 를 이용해서 const array 의 크기를 지정해주면, 사이즈를 쉽게 알 수 있다는 장점은 있지만 내용물의 갯수가 변할때마다 손으로 배열 크기를 조정해야 하는 문제가 생기죠 -_-..

뭐 더 쓰기좋고 편하고 킹왕짱인 C++ 알면 되지 C 는 왜 알려주고 있냐고 하시면 조엘 아저씨 글로 대신하겠습니다.

그리고 개인적으로 STL 은 list 말고는 잘 쓰지 않는 편입니다.
STL 이라는 표준을 따르는것도 좋지만 그다지 다른 플랫폼에서 돌릴일 없는 프로그램을 개발한다던가, 컴파일러가 표준을 제대로 지원하지 않는다면 표준을 따르지 않는게 나을때도 있죠. 물론 둘이 고만고만 하면 표준을 따르는게 좋겠지만 글쎄요, 처음에 말한 예제를 대체할 방법으로 vector 나 array 를 쓰는건 별로 편해보이지 않는군요 -_-;; std::string 이나 std::wstring 을 잘 쓰지 않는 이유도 많은 불편해서입니다. win32 api 들이 CString 을 parameter로 받는 경우도 있고, CString 을 쓰면 printf 같은곳에 parameter 를 넘길때 일일히 c_str 을 치지 않아도 알아서 잘 찍어준다는 점에 있습니다.

C로 시작한터라 STL 이 편하지 않기도 하고, 익숙치 않아 하는 말일수도 있겠습니다만 (library 개념도 없던 어렸을때는 매번 stack 과 queue, list 를 코딩했었습니다. -_-..), vector 는 constant data 를 initialize 하는데 편하지 않고 (혹시 그사이에 뭔가 추가되었나 하고 봤더니 이런게 있긴 하군요... http://www.bdsoft.com/tools/initutil.html) array 는 사이즈를 손으로 계산해서 넣어야 되서 불편합니다. (int array[] = { 1,2,3,4, 10, 11} 이런꼴로 간단하게 초기화 할 수 있는 방법이 있나요?)

vector 나 array 가 기존의 const array initialize 의 모든 장점을 다 들고 있으면 고민 않고 썼겠지만 '난 뭔가 달라~' 이러기 시작하면 쓸까 말까를 결정하는건 취향문제가 되기 시작합니다. 제가 쓴 원글에도 count_of 를 쓰지 않는게 좋다고는 써놨지만 stack memory 에 잠깐 생성한 fixed size buffer array 의 갯수를 셀때는 잘 쓰고 있습니다. (아주 제한적인 용도죠)

그런 의미에서 제가 들었던 예제가 너무 제한적인 용도로 사용되었다는 말은 들을지언정 대안이 아니다는 말을 들을정도는 아닌듯합니다 :D

덧글

  • 2009/05/26 16:29 # 답글 비공개

    비공개 덧글입니다.
  • KHAN 2009/05/26 16:42 #

    수정하였습니다. 감사드립니다.
댓글 입력 영역