콘텐츠로 이동

비표준 확장 (Nonstandard Extensions)

C++에 대한 비표준 확장은 별도로 지정하지 않는 한 사용할 수 없습니다.

컴파일러는 표준 C++의 일부가 아닌 다양한 확장을 지원합니다. 이러한 확장에는 GCC의 attribute, builtin_prefetch 또는 SIMD와 같은 내장 함수, #pragma, 인라인 어셈블리, __COUNTER, PRETTY_FUNCTION, 복합 명령문 표현식(예: foo = ({ int x; Bar(&x); x }), 가변 길이 배열 및 alloca() 및 " Elvis " a?:b 연산자가 포함됩니다.

  • 비표준 확장은 표준 C++에 없는 유용한 기능을 제공할 수 있습니다.
  • 컴파일러에 대한 중요한 성능 지침은 확장을 통해서만 지정할 수 있습니다.

  • 비표준 확장은 모든 컴파일러에서 작동하지 않습니다. 비표준 확장을 사용하면 코드 이식성이 떨어집니다.

  • 모든 대상 컴파일러에서 지원되더라도 확장이 잘 지정되지 않은 경우가 많으며 컴파일러 간에 미묘한 동작 차이가 있을 수 있습니다.
  • 비표준 확장은 독자가 코드를 이해하기 위해 알아야 하는 언어에 기능을 추가합니다.
  • 비표준 확장을 아키텍처 간에 포팅하려면 추가 작업이 필요합니다.

비표준 확장을 사용하지 마세요. 지정된 프로젝트 전체 이식성 헤더에서 해당 래퍼를 제공하는 한 비표준 확장을 사용하여 구현된 이식성 래퍼를 사용할 수 있습니다.


이해하기 쉽게 설명하기

핵심: 비표준 확장은 (지정된 경우 외) 쓰지 마라

컴파일러는 표준 C++가 아닌 확장을 많이 지원합니다 — GCC의 __attribute__, __builtin_prefetch, #pragma, 인라인 어셈블리, __PRETTY_FUNCTION__, 가변 길이 배열, alloca(), "엘비스" a?:b 연산자 등. 유용할 수 있지만 이식성을 떨어뜨리고, 잘 정의되지 않아 컴파일러마다 동작이 미묘하게 다를 수 있으며, 독자가 알아야 할 언어 기능을 늘립니다.

예외

지정된 프로젝트 전체 이식성 헤더가 래퍼를 제공한다면, 그 래퍼(내부적으로 비표준 확장으로 구현됨)는 쓸 수 있습니다.