Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

속성

속성에는 두 가지 유형이 있습니다. 비활성(inert) 속성(또는 내장(built-in) 속성)과 활성(active) 속성(비내장(non-builtin) 속성)입니다.

내장/비활성 속성

이 속성들은 컴파일러 자체, 즉 compiler/rustc_feature/src/builtin_attrs.rs와 속성 파서에 정의되어 있습니다.

예로는 #[allow]와 #[macro_use]가 있습니다.

이 속성들에는 몇 가지 중요한 특징이 있습니다.

  • 이 속성들은 항상 스코프 안에 있으며, 일반적인 경로 기반 해석에 참여하지 않습니다.
  • 이 속성들은 이름을 바꿀 수 없습니다. 예를 들어 use allow as foo는 컴파일되지만, #[foo]라고 작성하면 오류가 발생합니다.
  • 이 속성들은 ’비활성(inert)’입니다. 즉, 매크로 확장 코드가 이 속성들을 그대로 둡니다. 따라서 모든 동작은 컴파일러가 이 속성들의 존재 여부를 명시적으로 검사한 결과로 나타납니다. 예를 들어 린트 관련 코드는 #[allow], #[warn], #[deny], #[forbid]를 명시적으로 검사합니다. 동작이 속성 자체의 확장에서 비롯되는 것이 아닙니다.

이 속성들에 대한 자세한 내용은 속성 파싱에 관한 장을 참고하십시오.

새 내장 속성 추가에 관한 참고 사항

경고: 새 내장 속성을 추가하면 이름 해석 모호성이 생길 수 있습니다

새 내장 속성(이름이 예약되지 않은 것, 즉 이름이 rustc로 시작하지 않는 새 내장 속성)을 추가하면, 불안정(unstable) 기능 게이트를 적용하더라도 안정 코드에서 이름 해석 모호성 때문에 호환성이 깨질 수 있다는 점에 유의하십시오. 이는 (1) 안정 코드에 같은 이름의 매크로가 있고 그 매크로가 재익스포트되는 경우, 또는 (2) 같은 이름의 proc-macro derive 헬퍼 속성이 있는 경우에 발생합니다.

일반적으로 내장 속성은 사용자 정의 매크로나 proc-macro 헬퍼 속성과 충돌하지 않도록 처음에는 #[foo]가 아닌 #[rustc_foo]로 시작해야 할 것입니다. 그런 다음 안정화 전에 #[foo]로의 이름 변경을 별도로 수행해야 하며, 이때 crater 실행으로 영향을 평가하고 T-lang이 검토할 의도적 호환성 파괴 FCP 제안을 함께 제출해야 합니다.

또한 crater가 모든 경우를 다루지 않으며, 현존하는 모든 안정 코드를 포함하지도 않는다는 점을 기억하십시오.

참고:

‘비내장’/‘활성’ 속성

이 속성들은 크레이트에서 정의합니다. 이 크레이트는 표준 라이브러리일 수도 있고 proc-macro 크레이트일 수도 있습니다.

중요: #[derive] 같은 많은 비내장 속성도 여전히 Rust 핵심 언어의 일부로 간주됩니다. 하지만 표준 라이브러리에 대응하는 정의가 있으므로 ’내장 속성’이라고 부르지 않습니다.

비내장 속성은 두 가지 형태로 정의됩니다.

  1. proc-macro 속성: proc-macro 크레이트에서 #[proc_macro_attribute]가 붙은 함수로 정의됩니다.
  2. AST 기반 속성: 표준 라이브러리에 정의됩니다. 이 속성들에는 library/core/src/macros/mod.rs 같은 곳에 정의된 특별한 ‘스텁(stub)’ 매크로가 있습니다.

이러한 정의는 매크로가 일반적인 경로 기반 해석에 참여할 수 있도록 하기 위해 존재합니다. 즉, 다른 아이템 정의와 마찬가지로 임포트하거나, 다시 내보내거나, 이름을 바꿀 수 있습니다. 그러나 정의의 본문은 비어 있습니다. 대신 매크로에는 #[rustc_builtin_macro] 속성이 붙어 있으며, 이 속성은 컴파일러에게 rustc_builtin_macros에 있는 대응 함수를 실행하도록 지시합니다.

내장되지 않은 모든 속성은 다음과 같은 특징을 가집니다.

  • 다른 모든 정의(예: 구조체)와 마찬가지로, 이러한 속성은 임포트를 통해 스코프로 가져와야 합니다. 많은 표준 라이브러리 속성이 프렐루드에 포함되어 있습니다. 이 때문에 #[derive]를 임포트 없이 작성해도 동작합니다.
  • 이러한 속성은 매크로 확장에 참여합니다. 매크로 구현은 속성 대상을 변경하지 않고 그대로 두거나, 대상을 수정하거나, 새로운 AST 노드를 생성하거나, 대상을 완전히 제거할 수 있습니다.