왜 사람들은 C ++에서 __ (이중 밑줄)을 많이 사용합니까?


93

저는 오픈 소스 C ++ 코드를 살펴 보았는데 주로 변수 이름의 시작 부분에서 코드에서 사용 된 점수가 두 배로 많았습니다.

return __CYGWIN__;

이것에 대한 이유가 있는지 궁금하거나 일부 사람들의 코드 스타일입니까? 읽기 어렵게 만든다고 생각합니다.


2
왜 읽기가 어렵습니까? 따옴표처럼 대부분 구분자로 설계되었습니다. 내가 기억 하듯이, 주로 내장 상수에 사용됩니다.
Matthew Scharley

1
아니요, 구분자가 아닙니다. 밑줄은 구현을 위해 예약 된 이름과 사용자의 소스 코드가 사용할 수있는 이름을 구분하는 데 사용됩니다. 사용자는 할 수 #define FOO 1있지만 그렇게해서는 #define __FOO__ 1안되므로 구현시 __FOO__자체 매크로, 변수, 함수 등에 대한 이름 을 자유롭게 사용할 수 있습니다.
Jonathan Wakely

매튜는 그것이 기능적으로가 아니라 스타일 적으로 / 시각적으로 구분자임을 의미했다고 생각합니다. 흥미로운 가설이지만 이전에 읽은 내용과 Jonathan의 답변을 고려할 때 잘못된 것입니다.
JMI MADISON 2011

답변:


127

에서 C에서 프로그래밍 ++, 규칙 및 권장 사항 :

식별자에 두 개의 밑줄 (`__ ')을 사용하는 것은 ANSI-C 표준에 따라 컴파일러의 내부 사용을 위해 예약되어 있습니다.

밑줄 (`_ ')은 종종 라이브러리 함수의 이름 (예 : "_main"및 "_exit")에 사용됩니다. 충돌을 방지하려면 밑줄로 식별자를 시작하지 마십시오.


1
그 가이드 namespace는 소개 되기 전에 작성된 것처럼 보입니다 .
cz

또한 C ++ 표준이 아닌 런던 임페리얼 칼리지에서 가져온 것입니다. 좋은 제안 일 수 있습니다.
stucash

1
@cz 네임 스페이스는 관련이 없습니다. 시스템 헤더는 예를 들어 밑줄로 시작하는 매크로 이름을 정의 할 수 _main있습니다.
martinkunev

49

그들이 "구현의 일부", 즉 표준 라이브러리라고 느끼지 않는 한 그렇게해서는 안됩니다.

규칙은 상당히 구체적이며 다른 일부가 제안한 것보다 약간 더 자세합니다.

이중 밑줄을 포함하거나 밑줄로 시작하고 대문자가 오는 모든 식별자는 모든 범위에서 구현 사용을 위해 예약되어 있습니다. 즉, 매크로에 사용될 수 있습니다.

또한 밑줄로 시작하는 다른 모든 식별자 (즉, 다른 밑줄이나 대문자가 뒤 따르지 않음)는 전역 범위에서 구현하도록 예약되어 있습니다. 즉, 고유 한 네임 스페이스 또는 클래스 정의에서 이러한 식별자를 사용할 수 있습니다.

이것이 바로 마이크로 소프트가 C ++ 표준의 일부가 아닌 많은 핵심 런타임 라이브러리 함수에 대해 선행 밑줄이있는 함수 이름을 모두 소문자로 사용하는 이유입니다. 이러한 함수 이름은 표준 C ++ 함수 또는 사용자 코드 함수와 충돌하지 않도록 보장됩니다.


1
C ++에서는 [lex.name]과 전역 이름 [global.names] 만 표시됩니다. 참고 문헌을 줄 수 있습니까? 감사
a.lasram

36

C ++ 표준에 따르면 하나의 밑줄로 시작하는 식별자는 라이브러리 용으로 예약되어 있습니다. 두 개의 밑줄로 시작하는 식별자는 컴파일러 공급 업체 용으로 예약되어 있습니다.


18
그 이상 : 이중 밑줄이 포함 된 식별자 는 예약되어 있습니다. 17.4.3.1.2
Steve Jessop

C ++에서는 [lex.name]과 전역 이름 [global.names] 만 표시됩니다. 참고 문헌을 줄 수 있습니까? 감사
a.lasram

10

앞서 언급 한 내용이 정확합니다. __Symbol__일반적으로 유용한 컴파일러 (또는 전 처리기) 공급 업체에서 제공하는 매직 토큰입니다. 아마도 가장 널리 사용되는 것은 __FILE__및이며 __LINE__, C 전처리기에 의해 확장되어 현재 파일 이름과 줄 번호를 나타냅니다. 이는 오류의 텍스트 위치를 포함하여 일종의 프로그램 어설 션 실패를 기록하려는 경우에 편리합니다.


8

'일반'코드에서 수행 할 의도가없는 일입니다. 이렇게하면 컴파일러와 시스템 라이브러리가 사용자와 충돌하지 않는 기호를 정의 할 수 있습니다.


4

이중 밑줄은 구현에 예약되어 있습니다.

가장 많이 투표 한 답변은 C ++ 프로그래밍 : 규칙 및 권장 사항을 인용합니다 .

"식별자에 두 개의 밑줄 (`__ ')을 사용하는 것은 ANSI-C 표준에 따라 컴파일러의 내부 사용을 위해 예약되어 있습니다."

그러나 몇 C ++와 C 표준을 읽은 후, 나는 밑줄에 대한 언급이 제한되는 찾을 수 없습니다 단지 컴파일러의 내부. 표준은보다 일반적이며 구현을 위해 이중 밑줄을 유지 합니다 .

C ++

C ++ (현재 작업 초안, 2019-5-26에 액세스) 상태 lex.name:

  • 이중 밑줄 __을 포함하거나 밑줄로 시작하고 그 뒤에 대문자가 오는 각 식별자는 모든 용도로 구현에 예약되어 있습니다.
  • 밑줄로 시작하는 각 식별자는 전역 네임 스페이스에서 이름으로 사용하기 위해 구현에 예약되어 있습니다.

이 질문은 C ++에만 해당되지만 C 표준 99 및 17의 관련 섹션을 인용했습니다.

C99 섹션 7.1.3

  • 밑줄과 대문자 또는 다른 밑줄로 시작하는 모든 식별자는 항상 모든 용도로 예약되어 있습니다.
  • 밑줄로 시작하는 모든 식별자는 항상 일반 및 태그 이름 공간 모두에서 파일 범위가있는 식별자로 사용하도록 예약되어 있습니다.

C17 은 C99와 같은 것을 말합니다.

구현 은 무엇입니까 ?

C / C ++의 경우 구현 은 사용자 소스 파일에서 실행 파일을 생성하는 데 필요한 집합 리소스를 느슨하게 참조합니다. 여기에는 다음이 포함됩니다.

  • 전 처리기
  • 컴파일러
  • 링커
  • 표준 라이브러리

구현 예

Wikipedia에 언급 된 다양한 C ++ 구현이 있습니다. (앵커 링크 없음, ctrl + f "구현")

다음은 Digital Mars의 기능을 위해 일부 키워드를 예약하는 C / C ++ 구현의 예입니다.


3

다른 많은 사람들이 응답 한 라이브러리 외에도 일부 사람들은 전처리 기와 함께 사용할 매크로 또는 #define 값을 명명하기도합니다. 이렇게하면 작업이 더 쉬워지고 이전 컴파일러의 버그를 해결할 수 있습니다.

언급 한 다른 사람들과 마찬가지로 이름 충돌을 방지하고 라이브러리 변수와 자신의 변수를 구분하는 데 도움이됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.