유형 한정자

Type qualifier

C, C++D프로그래밍 언어에서 유형 한정자는 유형에 적용되는 키워드이며 결과적으로 유형이 한정됩니다.예를들면,const int는 상수 정수를 나타내는 정규형입니다.int는 대응하는 미수식 타입으로 단순한 정수입니다.D에서는 오브젝트 지향 프로그래밍에서 컨스트럭터와 유추하여 타입 컨스트럭터라고 합니다.

유형 한정자는 유형 시스템을 통해 값에 대한 추가 정보를 표현하고 데이터 사용의 정확성을 확인하는 방법입니다.유형 수식자는 일반적으로 C/C++ 언어 패밀리의 외부에서는 사용되지 않습니다.많은 언어는 상수 개념을 가지고 있지만 이를 형식 시스템을 통해가 아니라 상수('변화하지 않는 변수')라는 이름으로 표현합니다.아래의 대안을 참조하십시오.

언어별

C/C++

2014년과 C11년 기준 C에는 네 가지 유형의 예선전이 있다.const(C89),volatile(C89),restrict(C99) 및_Atomic(C11) – 후자는 사용자 정의 [1]이름과 충돌하지 않도록 개인 이름을 가집니다.처음 두 개는const그리고.volatile는 C++에도 존재하며 C++에서는 유일한 타입 수식자입니다.따라서 C++에서는 cv-qualified type(const 및 volatile의 경우)이라는 용어가 종종 "qualified type"에 사용되는 반면, "c-qualified type"과 "v-qualified type"이라는 용어는 한정자 중 하나만 관련될 때 사용됩니다.

이 중에서const는 지금까지 가장 잘 알려져 있으며 가장 많이 사용되고 있으며 C 및 C++ 표준 라이브러리에 나타나며 이러한 언어를 사용하면 항상 정확성을 충족해야 합니다.다른 수식어는 저수준 프로그래밍에 사용되며, 일반 프로그래머에 의해 널리 사용되기는 하지만 거의 사용되지 않습니다.하지만 한동안은volatile는 일부 C++ 프로그래머에 의해 스레드화 중 동기화에 사용되었지만 이는 권장되지 않았으며 현재 대부분의 컴파일러에서 중단되었습니다.

D

D에서 유형 생성자는 다음과 같습니다.const,immutable,shared,그리고.inout.immutable보다 강한 변종이다.const값을 변경할 수 없는 데이터를 나타냅니다.const이 참조를 통해 변경할 수 없는 데이터를 나타냅니다.변환 가능한 데이터에 대한 고정 뷰입니다. shared멀티캐스팅의 공유 데이터에 사용됩니다(예:volatileC++)에서 잠시 사용되었습니다. inout는, 데이터를 변경하지 않는(따라서 데이터의 미수식 타입에만 관계하는) 함수가 입력과 같은 수식 타입을 반환할 수 있도록 하기 위해서 사용하는 와일드 카드입니다. const그리고.immutable스토리지 클래스 지정자로도 사용할 수 있습니다.

구문

C 및 C++에서는 함수 선언 또는 변수 선언에서 1개 이상의 유형 지정자를 부여하고 선택적으로 유형 한정자를 부여한다.예를 들어 정수 변수는 다음과 같이 선언할 수 있습니다.

인트 x; 

어디에int는 타입 지정자입니다.부호 없는 정수 변수는 다음과 같이 선언할 수 있습니다.

서명되어 있지 않다 인트 x; 

둘 다unsigned그리고.int유형 지정자입니다.부호 없는 정수 변수는 다음과 같이 선언할 수 있습니다.

컨스턴트 서명되어 있지 않다 인트 x; 

어디에const유형 한정자이며, 이 수식자 유형은xconst unsigned int그리고 부적격형은unsigned int.

변수 선언에는 추가 스토리지 클래스 지정자가 있습니다.이것은 다른 토픽이지만, 타입과는 다릅니다.const또한 변수 선언은 스토리지 클래스, 즉 읽기 전용 메모리에 저장될 수 있음을 시사하는 것으로 간주됩니다.

휘발성 정확도

C와 C++의 다른 수식자는volatile오브젝트는 언제든지 프로그램 외부의 무언가에 의해 변경될 수 있으므로 액세스할 때마다 메모리에서 다시 읽어야 합니다.

이 수식자는 하드웨어를 직접 조작하는 코드(임베디드 시스템이나 디바이스 드라이버 등)나 멀티스레드 애플리케이션(그 컨텍스트에서 잘못 사용되는 경우가 많지만 휘발성 변수의 외부 링크 참조)에서 가장 많이 볼 수 있습니다.그것은 정확히 같은 방법으로 사용할 수 있다.const변수, 포인터, 참조 및 멤버 함수의 선언, 그리고 사실,volatileAndrei Alexandrescu가 말하는 유사한 계약별 설계 전략을 구현하기 위해 사용되기도 합니다.volatile-정확성,[2] 그러나 이것은 보다 훨씬 덜 일반적입니다.const- 정확합니다.volatile한정자를 삭제할 수도 있습니다.const_cast, 이 명령어는 와 조합할 수 있습니다.const다음 예시와 같이 한정자:

// 읽기 전용 하드웨어 레지스터에 대한 참조를 설정합니다. // 하드 코딩된 메모리 위치에 매핑됩니다. 컨스턴트 휘발성의 인트 & 하드웨어 등록  = *재해석_캐스트< >인트*>(0x8000);  인트 현재의 가치 = 하드웨어 등록; // 메모리 위치를 읽습니다. 인트 새로운 가치 = 하드웨어 등록;     // 다시 읽기  하드웨어 등록 = 5; // 오류, 상수 위치에 쓸 수 없습니다. 

왜냐면hardwareRegistervolatile프로그래머가 수정할 수 없더라도 두 개의 연속된 읽기에서 동일한 값을 유지한다는 보장은 없습니다.여기서의 의미론은 레지스터의 값이 읽기 전용이지만 반드시 변경되지 않음을 나타냅니다.

역사

유형 한정자의 개념이 도입되었습니다.예:readonly(나중에 개명)constBjarne Stroustrup이 1981년 [3]Bell Labs 내부 기술 메모에서 작성했으며,[4] C++의 전신인 Classes와 함께 C에 구현되었습니다.동기 부여에 대해 Strostrup은 다음과 같이 [4]쓰고 있습니다.

"이것은 두 가지 기능을 했습니다: 범위와 유형 규칙에 따르는 기호 상수를 정의하는 방법(매크로를 사용하지 않고)과 메모리 내의 객체를 불변으로 간주하는 방법.

const그 후 표준화의 일부로서 C에서 채택되어 C89(및 그 이후의 버전)에 다른 타입 한정자와 함께 표시됩니다.volatileANSI C 표준 위원회(X3J11)[5]에 의해 개발되었습니다. volatile1985년에 [6]등장하여 UNIX 커널을 MIPS용으로 컴파일하는 것이 초기 용도가 되어 통상적인 최적화가 휘발성 [7]변수에 적용되는 것을 방지함으로써 컴파일을 최적화할 수 있게 되었습니다.추가 수식자,noalias1987년 12월 X3J11 위원회 회의에서 제안되었으나 거부되었다; 그 목표는 결국 에 의해 달성되었다.restrictC99의 한정자.의 동기noalias을 보완했다volatile즉, 일반적으로 안전하지 않은 최적화가 수행될 수 있음을 나타냅니다.Ritchie는 활자 예선에는 그다지 찬성하지 않았고, 활자 예선에는 "자신의 역할을 다하지 못했다"고 주장했지만,[8] 결국 표준에서 삭제해야 한다고 주장하지는 않았다; 그는 반대했다.noalias하지만, 그것은 드래프트에서 떨어졌습니다.

Java에는 유형 한정자가 없으며 눈에 띄게 생략되어 있습니다.const: 1999년에 제안했던 추가는 거부되었습니다.특히 나중에 추가한 후 표준 라이브러리를 변경하여 일관되게 사용할 수 있도록 하면 호환성이 [9]깨집니다.단, Java는 처음에 구현 가능성을 열어두었습니다.const눈에 띄는 점은const예약어이지만 실제로는 키워드로 사용되지 않습니다.대신 자바에는 객체 지향 키워드가 있습니다.final이는 Atribute를 상수로 한정하기 위해(및 로컬 변수에도 해당) 사용되지만 유형을 한정하기 위해 사용되는 것은 아닙니다.

대체 수단

다른 언어에서는 항상성유형이 아닌 식별자(또는 이름 바인딩)의 속성을 고려하면서 다른 접근 방식을 취합니다.따라서 이러한 언어에는 단일 할당으로 일정한 식별자(변수에는 변화하지 않음)가 있지만 항상성의 개념은 없습니다. 항상성이 유형의 일부가 아니기 때문에 유형이 일치하지 않을 가능성이 없습니다.예를 들어 일정한 객체가 있는 Ada 83과constant키워드 [10][a]및 Java와final키워드를 지정합니다.

메모들

  1. ^ Ada 표준에서는 이것을 「예약어」라고 부릅니다.사용법에 대해서는, 그 문서를 참조해 주세요.

레퍼런스

  1. ^ C11: The New C Standard, Thomas Plum
  2. ^ C/C++ 유저 저널 C++ 익스퍼트 포럼의 Andrei Alexandrescu의 "Generic <Programming>: volatile – Multithreaded Programmer's Best Friend Volatile-Correctness or Have Your Compiler for you" (일반적인 <프로그래밍>: 휘발성 - 멀티스레드 프로그래머의 친구)
  3. ^ Bjarne Stroustrup, "C 언어 유형 개념의 확장", Bell Labs 내부 기술 메모, 1981년 1월 5일.
  4. ^ a b 형제간의 경쟁: C와 C++, Bjarne Stroustrup, 2002, 페이지 5
  5. ^ 데니스 M. Ritchie, "The Development of the C Language Archived 2015-01-10 at at archive.", 2003년: "X3J11에서는 유형 한정자 휘발성, 약간 다른 유형 프로모션 규칙 등 다수의 소규모 추가 및 조정도 도입되었습니다."
  6. ^ Mike Banahan, 1985년 9월 13일 유럽 UNIX System User Group(EUUC) 회의 테크니컬 토크 "The ANSI Draft Standard for the C Programming Language" (AUGN), Vol 6, No 73, Australian Unix Systems User Group Newsletter (AUGN)에 게재되어 있습니다.
  7. ^ John Mashey (16 Aug 1991). "Re: RISC vs CISC? Call a spade a spade?". Newsgroup: comp.arch. Usenet: 7037@spim.mips.COM.
  8. ^ 우선 12월 이전의 예선('계속'과 '휘발성')이 그 중요성을 갖는다는 것을 납득할 수 없다는 것부터 말씀드리겠습니다.언어 학습과 사용에 드는 비용을 더하면 더 큰 표현력으로 보상받을 수 없을 것 같습니다.특히 '휘발성'은 난해한 응용 프로그램의 프릴이며 다른 방법으로 훨씬 잘 표현됩니다.그것의 주된 장점은 거의 모든 사람이 그것을 잊을 수 있다는 것이다.'Const'는 더 유용하면서도 더 거슬립니다. 라이브러리 인터페이스에 존재하기 때문에 그에 대한 학습을 피할 수 없습니다.하지만 너무 늦었다고 해서 예선 탈락에 대해 왈가왈부하는 것은 아니다.
  9. ^ JDK-4211070: Java는 코드 유지보수를 위해 const 파라미터(C++ 등)를 지원해야 합니다.
  10. ^ 1815A, 3.2.1. 오브젝트 선언:
    "예약된 단어 상수가 개체 선언에 나타나는 경우 선언된 개체는 상수입니다. 선언에는 명시적인 초기화가 포함되어야 합니다.초기화 후에는 상수 값을 수정할 수 없습니다.서브프로그램과 엔트리의 모드의 형식 파라미터와 모드의 일반적인 형식 파라미터도 상수입니다.루프 파라미터는 대응하는 루프 내의 상수입니다.상수의 서브컴포넌트 또는 슬라이스는 상수입니다.

외부 링크