콘텐츠로 이동

비표준 확장 (Nonstandard Extensions)

C++의 비표준 확장은 따로 명시하지 않는 한 사용할 수 없습니다.

정의:

컴파일러들은 표준 C++의 일부가 아닌 여러 확장을 지원합니다. 그런 확장에는 GCC의 __attribute__, __builtin_prefetch나 SIMD 같은 내장 함수, #pragma, 인라인 어셈블리, __COUNTER__, __PRETTY_FUNCTION__, 복합문 표현식(예: foo = ({ int x; Bar(&x); x })), 가변 길이 배열과 alloca(), 그리고 "엘비스 연산자" a?:b가 있습니다.

장점:

  • 비표준 확장은 표준 C++에 없는 유용한 기능을 제공할 수 있습니다.
  • 컴파일러에 주는 중요한 성능 관련 지시는 확장으로만 표현할 수 있는 경우가 있습니다.

단점:

  • 비표준 확장은 모든 컴파일러에서 동작하지는 않습니다. 비표준 확장을 쓰면 코드의 이식성이 떨어집니다.
  • 대상으로 삼는 모든 컴파일러가 지원하더라도, 그 확장들은 명세가 잘 되어 있지 않은 경우가 많고 컴파일러마다 미묘한 동작 차이가 있을 수 있습니다.
  • 비표준 확장은 코드를 이해하려면 독자가 알아야 하는 언어 기능을 늘립니다.
  • 비표준 확장은 아키텍처를 옮겨 갈 때 추가 작업을 요구합니다.

결정:

비표준 확장을 사용하지 마세요. 비표준 확장으로 구현된 이식성 래퍼는 사용해도 되지만, 그 래퍼가 프로젝트 전체를 위해 지정된 이식성 헤더에서 제공되는 경우에 한합니다.


옮긴이 풀이

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

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

예외

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