2010-11-24 7 views
1

수많은 C/C++ 헤더 및 소스 파일에서이 기능을 보았습니다.
개인 취향을 제외하고 이러한 각기 다른 표기법의 의미는 무엇입니까?_NAME, __NAME, _NAME_, __NAME__과 같은 표기법의 의미

  • _NAME
  • __NAME
  • _NAME_
  • __NAME__
  • NAME_t

솔직히 I 이해할 유일한은 (a 클래스의 전용 부재 인 _NAME이고 적어도 C#에서는 그렇습니다).

누군가가 그 차이를 설명 할 수 있습니까?
다른 주목할만한 표기법이있는 경우 언급하십시오 (다른 유사한 언어로조차도).

감사합니다.

답변

5

_ 또는 __으로 시작하는 이름은 일반적으로 예약 된 식별자로 사용되므로 해당 규칙으로 시작하는 식별자를 정의하거나 작성하면 안됩니다. (_ 다음 상단 케이스)

C99 표준에서

, 7.1.3 - "예약 식별자"

- 밑줄로 시작하고 대문자 또는 다른 밑줄은 항상 예약되어 모든 확인 시험 과학 ERS 어떤 용도.

- 밑줄로 시작하는 모든 식별자는 항상 정규 및 태그 이름 공간에 파일 범위가있는 식별자 으로 사용하기 위해 예약되어 있습니다. C++ 03 표준 (C++ 98 개정) 섹션 17.4.3.1.2에서

- "글로벌 이름"

- 이중 밑줄을 포함하는 각 이름 (_ _) 또는 밑줄로 시작하여 밑줄로 뒤 따르는 대문자 (2.11)는 어떤 용도로든 구현에 예약되어 있습니다.

- 즉, 밑줄이 글로벌 네임 스페이스 이들 이름은 모두 "구현"을 위해 예약되어 NAME_t을 제외하고

3

,의 이름으로 사용하기 위해 구현에 예약되어 시작 각각의 이름 표준 C++ 라이브러리 코드입니다. 자신의 코드에 그러한 이름을 사용하는 것은 허용되지 않습니다..

섹션 17.6.3.3.2 "글로벌 이름"§1 상태 :

이름과 기능 서명

특정 세트는 항상 구현에 예약되어

:

  • 이중 밑줄을 포함하거나 다음 밑줄로 시작 각각의 이름 어떤 용도로든 대문자가 구현에 예약되어 있습니다.

  • 밑줄로 시작하는 각 이름은 전역 이름 공간에서 이름으로 사용하기위한 구현에 예약되어 있습니다.

는 (이 규칙은 내가 꽤 자주 본 __MY_FILE_H 같은 헤더 가드를 금지합니다.) _t 끝나는

+1

더 명확하게하기 위해 밑줄 *로 시작하는 클래스 수준 이름은 * 허용됩니다 (전역 이름 공간에 없기 때문에). 그리고 종종 개인 필드로 사용됩니다. –

+0

@Matteo : 두 번째 문자가 대문자가 아닌 한이 말이 맞습니다. 그러나'_ [A-Z _] +'는 완전히 예약되어 있습니다. –

+0

@R .: 예, 맞습니다. 다른 대답은이 점에서 더 완전합니다. –