2009. 4. 15. 11:10

Namespace 규칙 및 Reserved 상태

ANSI C89에 따르면 Namespace  에 대한 다음과 같은 규칙이 있다.

1. 밑줄 문자로 시작하고, 두 번째 문자가 밑줄이거나 대문자인 모든 이름은( 모든 scope와 모든 namespace에서)
   항상 reserved 상태이다.

2. 밑줄로 시작하는 모든 이름은 file scope에서 ordinary identifer ( 즉, 함수, 변수 typedef, enumeration constant
   등 )를 위해 reserve되어 있다.

3. 어떤 표준 헤더 파일을 포함했을 때, 그 헤더 파일에서 제공하는 모든 매크로 이름은 reserve디어 있다.

4. (함수 이름처럼) External linkage( global, non-static )를 가지는 모든 표준 라이브러리 identifier들은 
   External linkage를 위한 identifier로 reserve되어 있다.

5. 표준 헤더 파일에 정의되어 있는, file scope를 가지는 typedef와 tag이름은 그 헤더 파일을 포함 시켰을 경우,
  ( 같은 namespace를 지나는 )file scope에서 모두 reserve되어 있다.


scope : 영역이라는 의미로 C언어에서는 4개의 scope가 존재한다. funtion, file, block, prototype.
           prototype scope는 함수 prototype선언에서 파라메터 리스트 안에서 적용되는 것이다.
 


정리하자면

1.2 밑줄로 시작하는 이름을 쓰지 말라.
3   표준 매크로와 같은 이름을 쓰지말라.
4   표준 라이브러리에 있는 모든 변수 및 함수 이름과 다음 표에서 나온 이름을 쓰지 말라.

                  - Header Future directions patterns -
<ctype.h> is[a-z]*, to[a-z]* (function)
<errno.h> E[0-9]*, E[A-Z]* (macros)
<locale.h> LC_[A-Z]* (macros)
<math.h> cosf, sinf, sqrtf, etc.
              cosl, sinl, sqrtl, etc. (all functions)
<signal.h> SIG[A-Z]*, SIG_[A-Z]* (macros)
<stdlib.h> str[a-z]* (functions)
<string.h> mem[a-z]*, str[a-z]*, wcs[a-z]* (function)

5   표준에서 제공하는 typedef나 tag이름을 새로 정의하는 이름에 쓰지 말라.