질문 : C ++ 식별자에서 "_" 을 사용하는 규칙은 무엇입니까?
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 예약 식별자
각 헤더는 관련 하위 절에 나열된 모든 식별자를 선언하거나 정의하고, 선택적으로 모든 용도 또는 파일 범위 식별자로 사용하기 위해 항상 예약 된 관련 미래 라이브러리 지침 하위 절에 나열된 식별자를 선언하거나 정의합니다.
- 밑줄과 대문자 또는 다른 밑줄로 시작하는 모든 식별자는 항상 모든 용도로 예약되어 있습니다.
- 밑줄로 시작하는 모든 식별자는 항상 일반 및 태그 이름 공간 모두에서 파일 범위가있는 식별자로 사용하도록 예약되어 있습니다.
- 다음 하위 절 (향후 라이브러리 지침 포함)의 각 매크로 이름은 연관된 헤더가 포함 된 경우 지정된대로 사용하도록 예약되어 있습니다. 달리 명시되지 않는 한 (7.1.4 참조).
- 다음 하위 절 (미래 라이브러리 지침 포함)에서 외부 연결이있는 모든 식별자는 항상 외부 연결이있는 식별자로 사용하도록 예약되어 있습니다. 154
- 다음 하위 절 (향후 라이브러리 지침 포함)에 나열된 파일 범위를 가진 각 식별자는 매크로 이름 및 연관된 헤더가 포함 된 경우 동일한 이름 공간에서 파일 범위가있는 식별자로 사용하도록 예약되어 있습니다.
다른 식별자는 예약되지 않습니다. 프로그램이 예약 된 컨텍스트에서 식별자를 선언하거나 정의하거나 (7.1.4에서 허용하는 경우 제외) 예약 된 식별자를 매크로 이름으로 정의하는 경우 동작은 정의되지 않습니다.
프로그램이 위에 나열된 첫 번째 그룹에서 식별자의 매크로 정의를 제거하면 ( #undef
154) 외부 연결이있는 예약 된 식별자 목록에는 errno
, math_errhandling
, setjmp
및 va_end
됩니다.
다른 제한 사항이 적용될 수 있습니다. 예를 들어, POSIX 표준은 일반 코드에 나타날 가능성이있는 많은 식별자를 예약합니다.
E
시작하는 이름 뒤에 숫자 또는 대문자가 이어집니다.- 추가 오류 코드 이름에 사용될 수 있습니다.
- 하나로 시작하는 이름이
is
거나to
소문자 문자 다음에- 추가 문자 테스트 및 변환 기능에 사용할 수 있습니다.
LC_
시작하고 그 뒤에 대문자가 오는 이름- 로케일 속성을 지정하는 추가 매크로에 사용할 수 있습니다.
f
또는l
접미사가 붙은 기존의 모든 수학 함수의 이름은 예약되어 있습니다.- 각각 float 및 long double 인수에서 작동하는 해당 함수의 경우.
SIG
시작하고 그 뒤에 대문자가 오는 이름은 예약되어 있습니다.- 추가 신호 이름.
SIG_
시작하고 그 뒤에 대문자가 오는 이름은 예약되어 있습니다.- 추가 신호 조치를 위해.
str
,mem
또는wcs
시작하고 뒤에 소문자가 오는 이름은 예약되어 있습니다.- 추가 문자열 및 배열 함수.
PRI
또는SCN
시작하고 뒤에 소문자 또는X
가 오는 이름은 예약되어 있습니다.- 추가 형식 지정자 매크로
_t
로 끝나는 이름은 예약되어 있습니다.- 추가 유형 이름.
이러한 이름을 현재 자신의 목적으로 사용하면 문제가 발생하지 않을 수 있지만 해당 표준의 향후 버전과 충돌 할 가능성이 높아집니다.
개인적으로 저는 밑줄로 식별자를 시작하지 않습니다. 내 규칙에 대한 새로운 추가 : 밑줄을 거의 사용하지 않기 때문에 쉽게 이중 밑줄을 사용하지 마십시오.
이 기사에 대한 조사를 마친 후에는 POSIX 표준에 의해 예약되어 있으므로 _t
_t
끝나는 식별자에 대한 규칙은 저를 많이 놀라게했습니다. 나는 그것이 명확하고 공식적인 장과 구절을 찾는 POSIX 표준 (아직 확실하지 않음)이라고 생각합니다. 이것은 예약 된 이름을 나열 하는 GNU libtool 매뉴얼 에서 가져온 것입니다.
CesarB는 POSIX 2004 예약 기호에 대한 다음 링크를 제공하고 '다른 많은 예약 접두사 및 접미사를 찾을 수 있습니다. POSIX 2008 예약 기호가 여기에 정의되어 있습니다. 제한 사항은 위의 제한 사항보다 다소 미묘합니다.
출처 : https://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier
'프로그래밍 언어 > C++' 카테고리의 다른 글
주어진 키가 C ++ std :: map에 있는지 확인하는 방법 (0) | 2021.07.12 |
---|---|
"yield"키워드의 기능 (0) | 2021.07.12 |
Visual Studio C / C ++ 콘솔 애플리케이션에서 콘솔 창이 닫히지 않도록 방지 (0) | 2021.07.09 |
C ++에서 가상 기본 클래스 란? (0) | 2021.07.07 |
C #에서 돈의 단위로 사용하기에 가장 좋은 데이터 유형 (0) | 2021.07.07 |