unsigned char* p = NULL;
이라는 코드는 특정한 헤더를 include하지 않는 이상은 컴파일 에러가 나는 코드이다. 하지만 우리 눈에는 이 코드가 아주 자연스럽게 보인다. 게다가 C에서는 0이 아닌 NULL을 쓰는 습관을 길러야 한다고 이야기 해왔고, 일부 기고 글에서는 무효화된 포인터가 0이라는 것은 스펙에 정의되어 있지 않으므로 항상 컴파일러가 제공하는 헤더에 정의된 NULL이라는 값만 써야 한다는 주장도 있다. 그리고 실제 컴파일러도 NULL로 정의된 주소 값에 대해서는 일반 값과는 조금 다른 동작을 한다고도 알려져 있다. (casting이 관련된 경우)
vc++에 정의된 stdlib.h에 정의된 NULL 값을 보자. (Linux용 gcc라면 /usr/include/lunux/stddef.h에 있다)
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
(최신 버전의 g++에는 __null이 추가된 것 같긴 하지만 모든 컴파일러가 __null을 지원하는 것은 아니므로 일단은 예외로 하겠다)
Pascal의 경우에는 nil이란 예약어가 있어서 언어적으로 0과는 구분을 할 수 있게 해주었고 서로 섞어 쓸 수 없도록 문법적으로 막아 놓았다. 하지만 C++의 경우에는 #define의 값마저도 0과 동일하다. C++이 정상적인 프로그래밍 언어라면 #include 하나 없이도 코딩이 가능해야 한다. (OS API나 IO등의 디바이스 제어와 관련된 부분은 제외하고) 여기서 우리는 #include를 사용해서 NULL의 정의를 불러 올 것이냐, 아
니면 암묵적인 NULL로 통용되는 0을 사용할 것이냐는 문제에 빠진다.
이 문제에 대한 답은 없지만, 나의 경우에는 0을 사용하는 것으로 결정을 했다. 클래스 헤더 정의에서 포인터형의 멤버 변수가 있고 그것을 생성자 등에서 초기화 해야 할 때, 그것을 위해서 때문에 #include를 쓰고 싶지 않기 때문이다. 또한 순수 가상 함수를 정의하기 위한 때에도 같은 이유로 ‘= 0’만 사용한다.
Posted by 안영기