NULL에 대해

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 안영기

2009/03/15 07:24 2009/03/15 07:24
Response
0 Trackbacks , 0 Comments
RSS :
http://smgal.ismine.net/tc_191/blog1/rss/response/10

Trackback URL : 이 글에는 트랙백을 보낼 수 없습니다

« Previous : 1 : ... 37 : 38 : 39 : 40 : 41 : 42 : 43 : 44 : 45 : ... 50 : Next »

블로그 이미지

게임 개발을 기반으로 한, 잡다한 개발 기록 저장소

- 안영기

Notices

Archives

Authors

  1. 안영기

Recent Comments

Recent Trackbacks

Calendar

«   2024/11   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Site Stats

Total hits:
250281
Today:
255
Yesterday:
37