programing

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

nasanasas 2020. 9. 13. 10:39
반응형

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


나는 오픈 소스 C ++ 코드를 살펴 보았고 주로 변수 이름의 시작 부분에서 코드에서 사용되는 점수에서 많은 두 배를 발견했습니다.

return __CYGWIN__;

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


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

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

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


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

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

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

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

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


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


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


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


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

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


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

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

그러나 그 페이지의 주장은 근거없는 것 같습니다

몇 가지 C ++ 및 C 표준을 검색했지만 컴파일러의 내부 사용으로 제한되는 밑줄에 대한 언급을 찾을 수 없었습니다.

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

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

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

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

C99 섹션 7.1.3

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

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

참고 URL : https://stackoverflow.com/questions/224397/why-do-people-use-double-underscore-so-much-in-c

반응형