programing

"어떤 용도로도 사용할 수 있도록 예약"의 의미는 무엇인가?

prostudy 2022. 5. 22. 11:24
반응형

"어떤 용도로도 사용할 수 있도록 예약"의 의미는 무엇인가?

참고: 일부 C++ 전문가가 C++와 다른 표현을 사용하는 근거 또는 역사적 이유를 제공할 수 있는 경우에 대비하여 를 추가했지만, 이것은 c 이다.


C 표준 라이브러리 사양에는 다음과 같은 규범적 텍스트 C17 7.1.3 예약 식별자(강제 내 식별자):

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

이제 나는 여러 존경 받는 C 전문가들이 SO에 대한 답을 계속 읽는데, 그들은 컴파일러나 표준 라이브러리가 밑줄 + 대문자 또는 이중 밑줄이 있는 식별자를 사용하는 것이 괜찮다고 주장한다.

"어떤 용도로도 사용할 수 있도록 예약되어 있다"는 것은 C 언어 자체에 대한 미래 확장을 제외한 모든 사람을 위해 예약되어 있다는 것을 의미하지 않는가?구현이 이러한 기능을 사용할 수 없다는 의미.

위의 두 번째 구절은 단일 선행 밑줄에 관한 것이 실행으로 향하는 것처럼 보이나?

일반적으로 C 표준은 컴파일러 벤더/도서관 구현자가 애플리케이션 프로그래머가 아닌 전형적인 독서자가 될 것으로 예상하는 방식으로 작성된다.

특히 C++는 매우 다른 표현을 가지고 있다.

  • 이중 밑줄을 포함하는 각 이름(__) 또는 대문자(2.11) 뒤에 나오는 밑줄로 시작하며, 어떤 용도로도 구현을 위해 유보된다.

(C++ 식별자의 밑줄 사용에 대한 규칙은?를 참조하십시오.)

C와 C++의 혼용일 수도 있고 여기서 언어가 다른가?

C 표준에서 "예약"이라는 용어의 의미는 인용하는 글머리표 바로 아래 7.1.3p2로 정의된다.

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

강조 표시: 예약된 식별자는 프로그램 구현이 아니라 프로그램에 제한을 가한다.따라서, C에는 어떤 목적으로든 구현에 의해 예약된 식별자를 사용할 수 있다는 공통 해석이 정확하다.

나는 C++ 표준을 따라가지 못했고 더 이상 그것을 해석할 자격이 없다고 느낀다.

C와 C++의 문구의 차이와 관련하여, 나는 여기에 참고 자료로 나만의 작은 연구 결과를 올린다.

  • K&R C 1차 개정판은 다음과 같은 내용을 담고 있다.

    ...도서관의 기능에 의해서만 사용되는 이름들은 사용자 프로그램의 이름과 충돌할 가능성이 적도록 밑줄로 시작한다.

  • K&R 제2판은 표준 라이브러리를 다루는 부록 B를 추가했다. 여기서 우리는 읽을 수 있다.

    밑줄로 시작하는 외부 식별자는 모두 밑줄과 대문자 또는 다른 밑줄로 시작하는 다른 식별자와 마찬가지로 라이브러리에서 사용할 수 있도록 예약되어 있다.

  • "C90" ISO 9899:90뿐만 아니라 초기 ANSI C 초안은 현재 ISO 표준에서와 동일한 텍스트를 가지고 있다.

  • 그러나 가장 초기의 C++ 초안은 @hvd에서 언급한 바와 같이 다른 텍스트를 가지며, 아마도 C 표준에 대한 설명일 것이다.출처: 1994년 9월 20일:

    17.3.3.1.2 글로벌 이름
    ...
    (2하는 각 은 어떤 로도 사용할 수 .

따라서 몇 년 후 C++ 위원회가 표준 K&R 서적과 유사한 보다 명확한 표현을 사용한 반면, ANSI/ISO C90 위원회는 "사용할 수 있도록 예약"이라는 문구를 고안한 것으로 보인다.


C99 이론적 근거 V5.10에 따르면 다음과 같다 7.1.3.

또한 구현자를 위해 예약된 것은 밑줄로 시작하는 모든 외부 식별자와 밑줄로 시작하는 다른 모든 식별자 그리고 대문자 또는 밑줄로 시작하는 모든 식별자가 있다.이것은 수많은 비하인드 비외부 매크로를 쓸 수 있는 이름 공간을 제공하고 도서관이 제 역할을 제대로 하기 위해 필요한 기능을 제공한다.

이것은 위원회의 의도를 매우 분명하게 한다: "모든 사용을 위해 보존된" 것은 "실행자를 위해 보존된" 것을 의미한다.


또한 현재 C 표준은 6.2.5의 다른 표준 텍스트도 가지고 있다.

또한 구현 정의 확장 서명 정수 유형이 있을 수 있다. 38)

여기서 유용한 풋노트 38은 다음과 같이 말한다.

38) 구현 정의 키워드는 7.1.3에서 설명한 대로 모든 사용을 위해 예약된 식별자 형식을 가져야 한다.

이 기준서는 주로 시행자를 안내하기 위해 작성되지만, 무엇이 프로그램을 잘 형성하고 그 효과가 무엇인지에 대한 설명으로 작성된다.그 이유는 표준 적합성 컴파일러의 기본 정의는 모든 표준 적합성 프로그램에 대해 올바른 작업을 수행하는 정의이기 때문이다.

엄격히 준수되는 프로그램은 이 국제 표준에 명시된 언어와 라이브러리의 기능만 사용해야 한다...준수 호스트 구현은 엄격히 준수되는 프로그램을 수용해야 한다.

별도로 읽으시오, 이것은 컴파일러에 대한 확장에 매우 제한적이다.예를 들어, 오직 그 조항에 기초하여, 컴파일러는 그들 자신의 유보적인 단어를 정의해서는 안 된다.결국, 특정 컴파일러가 예약하고자 할 수 있는 어떤 주어진 단어라도, 그럼에도 불구하고 엄격히 준수되는 프로그램에 나타날 수 있고, 컴파일러의 손이 강요될 수 있다.

그러나 표준은 다음과 같이 계속된다.

엄격히 준수되는 프로그램의 동작을 변경하지 않는 경우, 적합한 구현에는 확장(추가 라이브러리 기능 포함)이 있을 수 있다.

그것이 핵심이다.컴파일러 확장자는 부적합한 프로그램(정의되지 않은 행동을 포함하거나 전혀 컴파일하지 않아야 하는 프로그램)에 영향을 미치도록 작성해야 하며, 컴파일러가 컴파일하여 재미있는 추가 작업을 할 수 있도록 해야 한다.

그러므로 언어가 실제로 어떤 것에 대해서도 식별자를 필요로 하지 않을 때 "예약된 식별자"를 정의하는 목적은 프로그램이 부적합하게 되는 몇 가지 사항을 제공함으로써 구현에 약간의 여분의 여지를 주는 것이다.컴파일러가 인식할 수 있는 이유, 말하자면__declspec로서, 선언의 日本語를 이다.__declspec선언문 작성은 다른 방법으로 불법이다. 그래서 컴파일러는 원하는 것은 무엇이든 할 수 있다.

따라서, "어떤 용도로도 보존"의 중요성은 그러한 식별자를 그것이 신경쓰는 의미를 가진 것으로 취급하는 컴파일러의 힘에 대해 의문을 남기지 않는다는 것이다.미래의 양립성은 비교적 먼 관심사다.

C++ 표준은 게임빗에 대해 좀 더 명시적이긴 하지만 비슷한 방식으로 작동한다.

적합한 프로그램의 동작을 변경하지 않는 경우, 적합한 구현에는 확장(추가 라이브러리 기능 포함)이 있을 수 있다.이 국제 표준에 따라 잘못된 형식의 확장을 사용하는 프로그램을 진단하려면 구현이 필요하다.그러나 그렇게 함으로써, 그들은 그러한 프로그램을 편성하고 실행할 수 있다.

나는 단지 확장이 어떻게 작용하는지에 대해 더 명확하게 말하는 것에 있어서 문구의 차이가 C++ 기준까지 내려간다고 의심한다.그럼에도 불구하고, C 표준의 어떤 것도 구현을 방해하지 않는다. (그리고 우리는 기본적으로 컴파일러가 당신이 사용할 때마다 당신에게 경고하는 요구사항을 무시한다.__declspec.)

C에는 기호가 다음과 같은 정의를 가질 수 있는 여러 컨텍스트가 있다.

  • 매크로 이름의 공백,
  • 매크로에 대한 인수의 형식 이름 공간(이 공간은 각 함수형 매크로에 한정됨),
  • 일반 식별자의 공간,
  • 태그 이름의 공백,
  • 레이블의 공간(이 공간은 각 기능에 따라 다름) 및
  • 구조/조합원의 공간(이 공간은 각 구조/조합에 특정된다).

"사용할 수 있도록 예약되어 있다"는 것은 호환 프로그램의 사용자 코드가 위의 문맥에서 대문자 또는 다른 밑줄 뒤에 오는 밑줄로 시작하는 기호를 사용할1 수 없다는 것을 의미한다.단일 밑줄로 시작하지만 소문자 번호 또는 숫자 뒤에 오는 식별자와 비교하십시오.이것은 밑줄로 시작하는 두 번째 종류의 식별자에 속한다.사용자 코드는 이러한 식별자를 매크로 인수의 이름, 레이블 또는 구조/조합원의 이름으로 사용할 수 있다.

"어떤 용도로도 사용할 수 있도록 보존된" 것이 구현이 그러한 기호를 사용할 수 없다는 것을 의미하지는 않는다.예약의 목적은 구현에 의해 정의된 이름이 준수 프로그램에서 사용자 코드로 정의한 이름과 충돌할 염려 없이 구현이 자유롭게 사용할 수 있는 이름 공간을 제공하는 것이다.


1그 표준이 "사용할 수 없다"는 것을 의미하는 것은 아니다.이 표준은 이중 밑줄로 시작하는 소수의 이름을 프로그래밍 방식으로 사용하도록 권장한다.예를 들어, 규정 준수를 위해 구현이 필요하다.__STDC_VERSION__,__FILE__,__LINE__그리고__func__2011년 버전의 표준은 심지어 다음과 같은 것으로 추정되는 준수 프로그램의 예를 제시한다.__func__.

C 표준은 구현이 그들이 적합하다고 보는 의미를 예약된 식별자에 부착할 수 있도록 허용한다.대부분의 구현은 달리 할 이유가 없을 때 예약된 형식의 인식되지 않은 식별자를 다른 인식된 식별자와 동일하게 취급하여 다음과 같은 것을 허용한다.

#ifdef __ACME_COMPILER
#define near __near
#else
#define near
#endif

int near foo;

식별자를 선언하다fooa를 사용하여__near코드가 Acme 컴파일러에서 처리되고 있는 경우(아마도 그러한 것을 지원할 수 있을 것이다), 그러나 그러한 지시의 사용을 요구하거나 이익을 얻지 못하는 다른 컴파일러와도 호환될 수 있는 한정자.그 어떤 것도 적절한 구현이 정의되는 것을 막을 수 없다.__ACME_COMPILER그리고 해석하는 것__near"핵 미사일 발사"를 의미하지만, 품질 구현이 위와 같은 코드를 깨기 위해 그 방식에서 벗어나서는 안 된다.구현이 무엇을 모르는 경우__ACME_COMPILER다른 미지의 식별자처럼 취급하면 위와 같은 유용한 구조를 지원할 수 있다.

몇 달이나 늦었지만 다른 것들은 다루지 않았다.

당신의 질문은 반대 방향에서 볼 수 있다.표준은 (관측한 바와 같이) 다음과 같은 기호를 사용할 수 있도록 허용한다._Foo그러나, 더 중요한 것은, 따라서 구현이foo후자는 당신이 사용하기 위해 남겨둔 것이다.

이해하기 위해, 토론을 위해, 미래 C 표준이 새로운 키워드를 도입했다고 가정하자._Foo가상의 구현은 이미 이 기호를 사용하고 있었는데, 어떻게 되는가?

답변:

  1. 처음에는 아직 새로운 표준을 시행하지 않을 것이다.시행될 때까지 새로운 표준은 실질적인 효과가 없다.

  2. 이후, 새로운 표준의 이행의 일환으로, 이행은 조용히 각 표준을 변경한다._Foo_Bar.

문제 없어요.

사실 이런 식으로 생각해 보면 표준이 그런 말을 비축해 두는 방식이 거의 유일한 방법이라고 말할 수 있다.

참조URL: https://stackoverflow.com/questions/52367490/whats-the-meaning-of-reserved-for-any-use

반응형