Attribute specifier sequence (since C23)
타입, 객체, 표현식 등에 대한 구현 정의 속성을 소개합니다.
목차 |
구문
-
[[attr ]][[attr1 , attr2 , attr3(args)]][[attribute-prefix::attr (args)]]
공식적으로, 구문은 다음과 같습니다.
[[
attribute-list
]]
|
(C23 이후) | ||||||||
여기서 attribute-list 는 0개 이상의 attribute-token 들로 구성된 쉼표로 구분된 시퀀스입니다
| 표준 속성 | (1) | ||||||||
속성 접두사
::
식별자
|
(2) | ||||||||
표준 속성
(
인수 목록
(선택 사항)
)
|
(3) | ||||||||
속성 접두사
::
식별자
(
인수 목록
(선택 사항)
)
|
(4) | ||||||||
여기서 attribute-prefix 는 identifier 이고 argument-list 는 괄호, 대괄호, 중괄호가 균형을 이루는 토큰들의 시퀀스입니다 ( balanced-token-sequence ).
설명
속성(Attributes)은 GNU 및 IBM 언어 확장
__attribute__((...))
, Microsoft 확장
__declspec()
등과 같은 구현 정의 언어 확장을 위한 통합 표준 구문을 제공합니다.
속성은 C 프로그램의 거의 모든 곳에서 사용될 수 있으며, 거의 모든 것에 적용될 수 있습니다: 타입, 변수, 함수, 이름, 코드 블록, 전체 번역 단위에 적용 가능하지만, 각 특정 속성은 구현에서 허용되는 곳에서만 유효합니다:
[[expect_true]]
는
if
문과 함께만 사용될 수 있고 클래스 선언에는 사용될 수 없는 속성일 수 있습니다.
[[omp::parallel()]]
는 코드 블록이나
for
루프에 적용될 수 있지만
int
타입에는 적용될 수 없는 속성일 수 있습니다 (이 두 속성은 가상의 예시이며, 표준 및 일부 비표준 속성에 대해서는 아래를 참조하십시오).
선언에서 속성은 전체 선언 앞에 나타날 수도 있고, 선언된 엔티티의 이름 바로 뒤에 나타날 수도 있으며, 후자의 경우 결합됩니다. 대부분의 다른 상황에서는 속성이 바로 앞의 엔티티에 적용됩니다.
두 개의 연속된 왼쪽 대괄호 토큰(
[[
)은 attribute-specifier를 도입할 때나 attribute argument 내부에서만 나타날 수 있습니다.
아래에 나열된 표준 속성 외에도, 구현체들은 구현 정의 동작을 가진 임의의 비표준 속성을 지원할 수 있습니다. 구현체가 알지 못하는 모든 속성은 오류를 발생시키지 않고 무시됩니다.
모든
standard-attribute
는 표준화를 위해 예약되어 있습니다. 즉, 모든 비표준 속성은 구현체에서 제공하는
attribute-prefix
로 접두사가 붙습니다, 예를 들어
[[gnu::may_alias]]
와
[[clang::no_sanitize]]
와 같습니다.
표준 속성
C 표준에 의해 정의된 속성은 다음과 같습니다. 이름이
attr
형태인 모든 표준 속성은
__attr__
로도 표기할 수 있으며 그 의미는 변경되지 않습니다.
[[
deprecated
]]
(C23)
[[
deprecated
("
reason
")]]
(C23)
|
이 속성으로 선언된 이름이나 엔티티의 사용이 허용되지만 특정
이유
로 권장되지 않음을 나타냅니다.
(속성 지정자) |
[[
fallthrough
]]
(C23)
|
이전 case 레이블에서의 폴스루(fallthrough)가 의도적이며 폴스루에 대해 경고하는 컴파일러에 의해 진단되지 않아야 함을 나타냅니다.
(속성 지정자) |
|
반환 값이 폐기될 경우 컴파일러가 경고를 발생하도록 권장합니다.
(속성 지정자) |
|
[[
maybe_unused
]]
(C23)
|
사용되지 않는 엔티티에 대한 컴파일러 경고를 억제합니다(해당하는 경우).
(속성 지정자) |
|
함수가 반환하지 않음을 나타냅니다.
(속성 지정자) |
|
[[
unsequenced
]]
(C23)
|
함수가 상태가 없고(state-less), 부작용이 없으며(effect-less), 멱등적(idempotent)이고 독립적임을 나타냅니다.
(속성 지정자) |
[[
reproducible
]]
(C23)
|
함수가 부작용이 없고(effect-less) 멱등적(idempotent)임을 나타냅니다.
(속성 지정자) |
속성 테스트
__has_c_attribute(
attribute-token
)
|
|||||||||
attribute-token 으로 명명된 속성 토큰의 존재 여부를 확인합니다.
표준 속성의 경우, 해당 속성이 작업 초안에 추가된 연도와 월로 확장됩니다(아래 표 참조). 벤더별 속성의 존재 여부는 0이 아닌 정수 상수로 결정됩니다.
__has_c_attribute
는
#if
와
#elif
표현식에서 확장될 수 있습니다.
이것은
#ifdef
,
#ifndef
,
defined
에 의해 정의된 매크로로 취급되지만 다른 곳에서는 사용할 수 없습니다.
| attribute-token | 속성 | 값 | 표준 |
|---|---|---|---|
deprecated
|
[[
deprecated
]]
|
201904L | (C23) |
fallthrough
|
[[
fallthrough
]]
|
201904L | (C23) |
maybe_unused
|
[[
maybe_unused
]]
|
201904L | (C23) |
nodiscard
|
[[
nodiscard
]]
|
202003L | (C23) |
noreturn
_Noreturn
|
[[
noreturn
]]
[[
_Noreturn
]]
|
202202L | (C23) |
unsequenced
|
[[
unsequenced
]]
|
202207L | (C23) |
reproducible
|
[[
reproducible
]]
|
202207L | (C23) |
예제
[[gnu::hot]] [[gnu::const]] [[nodiscard]] int f(void); // 세 개의 속성을 가진 f 선언 [[gnu::const, gnu::hot, nodiscard]] int f(void); // 위와 동일하지만 세 개의 속성을 포함하는 // 단일 속성 지정자를 사용 int f(void) { return 0; } int main(void) { }
참고문헌
- C23 표준 (ISO/IEC 9899:2024):
-
- 6.7.12 Attributes (p: TBD)
참고 항목
|
C++ documentation
for
Attribute specifier sequence
|
외부 링크
| 1. | GCC의 속성 |
| 2. | Clang의 속성 |