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

자려는데 대략 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 표준 안에서 쓰는게 안전하겠다.