문제

C ++에서는 로컬 변수 나 매개 변수가 아닌 멤버 변수라는 사실을 나타 내기 위해 어떤 종류의 접두사를 가진 멤버 변수를 지명하는 것이 일반적입니다. MFC 배경에서 온 경우 아마도 m_foo. 나도 보았다 myFoo 가끔.

C# (또는 아마도 .NET)은 밑줄 만 사용하는 것이 좋습니다. _foo. C ++ 표준에 의해 허용됩니까?

도움이 되었습니까?

해결책

규칙 (C ++ 11에서 변경되지 않은 규칙) :

  • 사용을 포함하여 모든 범위로 예약됩니다 구현 매크로 :
    • 밑줄로 시작한 식별자 다음에 대문자 편지가 있습니다.
    • 인접한 밑줄을 포함하는 식별자 (또는 "이중 밑줄")
  • 글로벌 네임 스페이스에 예약 :
    • 밑줄로 시작하는 식별자
  • 또한, 모든 것 std 네임 스페이스가 예약되어 있습니다. (하지만 템플릿 전문화를 추가 할 수 있습니다.)

2003 C ++ 표준에서 :

17.4.3.1.2 글로벌 이름 [lib.global.names

특정 이름과 기능 서명 세트는 항상 구현에 예약되어 있습니다.

  • 이중 밑줄이 포함 된 각 이름 (__) 또는 밑줄로 시작한 다음 대문자 문자 (2.11)가 모든 용도로 구현에 예약되어 있습니다.
  • 밑줄로 시작하는 각 이름은 글로벌 네임 스페이스에서 이름으로 사용하기 위해 구현에 예약되어 있습니다.165

165) 이러한 이름은 네임 스페이스로도 예약되어 있습니다 ::std (17.4.3.1).

C ++는 C 표준 (1.1/2, C ++ 03)을 기반으로하고 C99는 규범 참조 (1.2/1, C ++ 03)이기 때문에 1999 C 표준에서도 적용됩니다.

7.1.3 예약 식별자

각 헤더는 연관된 하위 클래스에 나열된 모든 식별자를 선언하거나 정의하고, Alking 또는 File Scope 식별자로 항상 사용하도록 예약 된 Associated Future Library Directions 하위 클레스트 및 식별자에 나열된 식별자를 선택적으로 선언하거나 정의합니다.

  • 밑줄과 대문자 또는 다른 밑줄로 시작하는 모든 식별자는 항상 모든 용도로 예약되어 있습니다.
  • 밑줄로 시작하는 모든 식별자는 항상 일반 및 태그 이름 공간에서 파일 범위를 가진 식별자로 사용하도록 예약됩니다.
  • 다음 하위 경고 (미래 라이브러리 방향 포함)의 각 매크로 이름은 관련 헤더가 포함 된 경우 지정된대로 사용하도록 예약됩니다. 명시 적으로 명시되지 않는 한 (7.1.4 참조).
  • 다음 하위 경고 (미래 라이브러리 방향 포함)에서 외부 연결이있는 모든 식별자는 항상 외부 연결이있는 식별자로 사용하도록 예약됩니다.154
  • 다음 하위 클레어 (미래 라이브러리 방향 포함)에 파일 범위가 나열된 각 식별자는 매크로 이름으로 사용되도록 예약되어 있으며 관련 헤더가 포함 된 경우 동일한 이름 공간에 파일 스코프가있는 식별자로 사용됩니다.

다른 식별자는 예약되어 있지 않습니다. 프로그램이 예약 된 컨텍스트에서 (7.1.4에 의해 허용되지 않는지) 식별자를 선언하거나 정의하는 경우, 예약 식별자를 매크로 이름으로 정의하면 동작이 정의되지 않습니다.

프로그램이 제거되는 경우 ( #undef) 위에 나열된 첫 번째 그룹에서 식별자의 매크로 정의는 동작이 정의되지 않습니다.

154) 외부 연결이있는 예약 식별자 목록에는 포함됩니다 errno, math_errhandling, setjmp, 그리고 va_end.

다른 제한이 적용될 수 있습니다. 예를 들어, POSIX 표준은 일반 코드로 표시 될 수있는 많은 식별자를 보유합니다.

  • 수도로 시작하는 이름 E 숫자 또는 대문자를 따랐습니다.
    • 추가 오류 코드 이름에 사용될 수 있습니다.
  • 어느 쪽이든 시작하는 이름 is 또는 to 이어서 소문자가 이어집니다
    • 추가 문자 테스트 및 변환 기능에 사용될 수 있습니다.
  • 시작하는 이름 LC_ 대문자가 이어집니다
    • 로케일 속성을 지정하는 추가 매크로에 사용될 수 있습니다.
  • 접미사 된 모든 기존 수학 기능의 이름 f 또는 l 예약되어 있습니다
    • 플로트 및 긴 이중 인수에서 각각 작동하는 해당 기능의 경우.
  • 시작하는 이름 SIG 이어서 대문자가 예약되어 있습니다
    • 추가 신호 이름의 경우.
  • 시작하는 이름 SIG_ 이어서 대문자가 예약되어 있습니다
    • 추가 신호 작업의 경우.
  • 이름으로 시작합니다 str, mem, 또는 wcs 이어서 소문자가 예약되어 있습니다
    • 추가 문자열 및 배열 함수의 경우.
  • 이름으로 시작합니다 PRI 또는 SCN 이어서 소문자 또는 X 예약되어 있습니다
    • 추가 형식 지정자 매크로
  • 끝나는 이름 _t 예약되어 있습니다
    • 추가 유형 이름의 경우.

지금 당장 자신의 목적을 위해 이러한 이름을 사용하면 문제가 발생하지 않을 수 있지만, 해당 표준의 미래 버전과의 충돌 가능성이 높아집니다.


개인적으로 나는 단지 밑줄로 식별자를 시작하지 않습니다. 내 규칙에 새로운 추가 : 이중 밑줄을 어디서나 사용하지 마십시오. 밑줄을 거의 사용하지 않기 때문에 쉽습니다.

이 기사에 대한 연구를 한 후에는 더 이상 내 식별자를 끝내지 않습니다. _t이것은 POSIX 표준에 의해 예약되어 있습니다.

식별자에 대한 규칙 _t 저를 많이 놀랐습니다. 나는 그것이 설명과 공식 장과 구절을 찾고있는 POSIX 표준 (아직 확실하지 않음)이라고 생각합니다. 이것은에서 나온 것입니다 GNU Libtool 매뉴얼, 예약 된 이름을 나열합니다.

Cesarb는 다음과 같은 링크를 제공했습니다 POSIX 2004 예약 된 기호와 메모 ''많은 다른 예약 된 접두사와 접미사는 ... 그곳에서 찾을 수 있습니다. ' 그만큼POSIX 2008 예약 된 기호는 여기에 정의되어 있습니다. 제한은 위의 제한보다 다소 미묘합니다.

다른 팁

이름의 충돌을 피하기위한 규칙은 C ++ 표준 (Stroustrup Book 참조)에 있으며 C ++ 전문가 (Sutter 등)에 의해 언급되었습니다.

개인 규칙

나는 사건을 다루고 싶지 않았고 간단한 규칙을 원했기 때문에 개인의 간단하고 정확한 것 :

기호를 지명 할 때는 컴파일러/OS/표준 라이브러리와의 충돌을 피할 수 있습니다.

  • 밑줄로 기호를 시작하지 마십시오
  • 내부에 두 개의 연속 밑줄이있는 기호의 이름을 말하지 마십시오.

물론, 코드를 고유 한 네임 스페이스에 넣으면 충돌을 피하는 데 도움이됩니다 (그러나 악한 매크로로부터 보호하지는 않습니다)

몇 가지 예

(매크로는 C/C ++ 기호의 코드 폴 루팅이기 때문에 Macros를 사용하지만 변수 이름부터 클래스 이름에 이르기까지 모든 것이 될 수 있습니다)

#define _WRONG
#define __WRONG_AGAIN
#define RIGHT_
#define WRONG__WRONG
#define RIGHT_RIGHT
#define RIGHT_x_RIGHT

C ++ 0x 드래프트에서 추출합니다

로부터 N3242.pdf 파일 (최종 표준 텍스트가 비슷할 것으로 예상) :

17.6.3.3.2 글로벌 이름 [Global.names

특정 이름과 기능 서명 세트는 항상 구현에 예약되어 있습니다.

- 이중 밑줄이 포함 된 각 이름 _ _ _ _ _ _ 밑줄로 시작한 다음 대문자 문자 (2.12)로 시작하여 모든 용도로 구현에 예약됩니다.

- 밑줄로 시작하는 각 이름은 글로벌 네임 스페이스에서 이름으로 사용하기 위해 구현에 예약되어 있습니다.

그러나 또한 :

17.6.3.3.5 사용자 정의 리터럴 접미사 [usrlit.suffix

밑줄로 시작하지 않는 문자 접미사 식별자는 향후 표준화를 위해 예약되어 있습니다.

이 마지막 조항은 하나의 밑줄로 시작하는 이름을 고려하지 않고 소문자를이어야한다는 것을 고려하지 않는 한 혼란 스럽습니다. ~ 아니다 글로벌 네임 스페이스에 정의되었습니다 ...

에서 MSDN:

식별자의 시작 부분에 두 개의 순차적 인 밑줄 문자 (__)를 사용하거나 단일 선행 밑줄과 대문자를 사용하여 모든 스코어에서 C ++ 구현을 위해 예약되어 있습니다. 현재 또는 미래의 예약 식별자와 충돌 할 수 있기 때문에 파일 범위가있는 이름에 대한 소문자를 사용하지 않아야합니다.

즉, 단일 밑줄을 멤버 변수 접두사로 사용할 수 있습니다.

이것은 C ++ 표준의 17.4.3.1.2 절에서 가져온 것으로 보이지만 전체 표준 온라인의 원래 소스를 찾을 수는 없습니다.

또한보십시오 이 질문.

질문의 다른 부분은 밑줄을 내부와는 충돌하지 않는 변수 이름 중

나는 클래스와 네임 스페이스 내에서도 이것을한다. 왜냐하면 나는 하나의 규칙 만 기억해야하기 때문이다 ( "글로벌 범위의 이름 끝에서, 다른 곳의 이름의 시작과 비교할 때").

예, 밑줄은 식별자의 어느 곳에서나 사용할 수 있습니다. 나는 규칙이 다음과 같이 믿습니다 : AZ, AZ, _, 첫 번째 문자에서는 다음 문자의 경우 + 0-9입니다.

밑줄 접두사는 C 코드에서 일반적입니다. 단일 밑줄은 "개인"을 의미하며 이중 밑줄은 일반적으로 컴파일러에서 사용하도록 예약됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top