당신 역시 초보일 수 있습니다

자려는데 대략 C/C++ 프로그래머의 혼을(…) 소환하는 글이 있어서.

http://lymose.egloos.com/4958036 당신도 초보일 수 있습니다.” 에 트랙백.

저 글에서 트랙백한 원본 글에 나와있는 다음과 같은 코드가 있다.

char *dim = { 3, 1, 5, 9, 7 };
foo(dim);   /* 5개 합산 -> 정상 */

의미론적으로 문제가 좀 있긴 하지만, C 코드라고 놓고 보면 하등의 문제가 없는 코드다 — 적어도 C99의 범위에서 생각하면 말이다.

C언어는 integer-like type을 정말 조용히 pointer-type으로 바꿔주는 언어이기에 위 코드는 경고야 몇 개 뜨겠지만 별탈없이 컴파일된다. 예를 들어 gcc 4.3.2에 -std=c99 옵션을 주고 컴파일하면,

test.c:5: warning: initialization makes pointer from integer without a cast
test.c:5: warning: excess elements in scalar initializer
test.c:5: warning: (near initialization for ‘dim’)

하는 식으로 워닝은 뜨지만 컴파일은 잘 된다. 물론 의미적으론 문제가 있어서 제대로 돌꺼란 기대는 하지 말자. (물론 참조만 안하면야 문제는 없다 :P )

이에 대한 대안은 저 블로그에서 얘기하고 있는 것들이 아니다. 적어도 저 블로그에서 잘못을 지적하기 위해서 C++을 동원해서 (아마도 VS 에서) 컴파일했다면, 저런 이상한걸 알려줄게 아니라 훨씬 유용한 두 가지 대안 중 한가지는 제시했어야 한다.  혹은 C++ 이라고 그냥 가정했다면 C 에 대해서도 좀 더 알 필요가 있다.

  • 대다수의 C++ 프로그래머가 친숙할 std::vector<T>. 배열의 가장 잘 알려진 대안이다.
  • 최근의 C++ 흐름을 알고 있어서 TR1의 라이브러리들을 알거나, boost 라이브러리를 사용하는 C++ 프로그래머가 알만한 array<T, length> 라는 고정 길이 배열에 대한 안전한 대안이 있다

C++을 제대로 된 언어로 쓰고 싶다면 이런 류의 대안은 제시해줘야 한다. 그렇지 않을것이라면 언어 복잡도가 상대적으로 낮은 C 표준 안에서 쓰는게 안전하겠다.

물론 이 글을 쓰고 있는 rein 역시 딱히 C++을 잘하는 건 아니다. 그렇지만 이걸로 밥 벌어먹고 사는데(…) 좀 더 많은 것들을 참고하고 바르게 쓰려곤 노력한다. 그런 의미에서 이 글도 오류가 있을 수 있다 :$

Jinuk Kim
Jinuk Kim

SW Engineer / gamer / bookworm / atheist / feminist

Articles: 935

5 Comments

  1. Warning treated as error & STL…

    처음 글 :  http://lymose.egloos.com/4958036트랙백 원글 : http://rein.kr/blog/archives/1642

    0. 변명…?사실 문법에 크게 신경쓰는 편은 아닙니다. 무엇이 표준에 맞나 하는 문제는 그냥 C++ FAQ 나 인터넷에서 줏어들은 걸 하나씩 적용하는 정도지, 표준문서 뒤지고 이러지는 않습니다. 근처에도 표준문서 뒤지는 사람의 빈도가 꽤나 낮은…..

  2. 프로그래머에 배움이란…

    중요하면서도 좋은 것입니다.
    Warning treated as error & STL 에서 트랙백
    바로 밑의 글도 읽고나서 읽으시면 됩니다. :$
    1. Warning을 무시해도 된다는 얘긴 아닙니다. 원글에서 중점을 두고 얘기한건 배열 길이 계산에 관한 문제 — 지극히 C 적인 코드 — 인데 그걸 C++ 차원에서 컴파일하고 / 해석하는건 좀 심하다고 생각해서 글을 썼을 뿐입니다.
    그리고 왜 Zoel 블로그를 링크해 주셨는…

Leave a Reply