Namespaces
Variants

Implementation defined behavior control

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

구현 정의 동작은 #pragma 지시어에 의해 제어됩니다.

목차

구문

#pragma pragma-params (1)
_Pragma( string-literal ) (2) (C++11 이후)
1) 구현에서 정의된 방식으로 동작합니다.
2) string-literal 에서 L 접두사(있는 경우), 바깥쪽 따옴표, 그리고 앞뒤 공백을 제거하고, \ " " 로, \\ \ 로 각각 치환한 후, 결과를 토큰화하고( 번역 단계 3 참조), 이 결과를 (1) #pragma 입력으로 사용합니다.

설명

프라그마 지시문은 컴파일러 경고 비활성화나 정렬 요구사항 변경과 같은 컴파일러의 구현별 동작을 제어합니다. 인식되지 않는 모든 프라그마는 무시됩니다.

비표준 프라그마

ISO C++ 언어 표준은 컴파일러가 어떤 프라그마도 지원하도록 요구하지 않습니다. 그러나 여러 구현체에서 여러 비표준 프라그마를 지원합니다:

#pragma STDC

ISO C 언어 표준은 C 컴파일러가 다음 세 가지 프라그마(pragma)를 지원하도록 요구하며, 일부 C++ 컴파일러 벤더들은 자신들의 C++ 프론트엔드에서 다양한 정도로 이를 지원합니다:

#pragma STDC FENV_ACCESS 인수 (1)
#pragma STDC FP_CONTRACT 인수 (2)
#pragma STDC CX_LIMITED_RANGE 인수 (3)

여기서 arg ON , OFF , 또는 DEFAULT 중 하나입니다.

1) ON 으로 설정되면, 프로그램이 floating-point environment 에 접근하거나 수정할 것임을 컴파일러에 알립니다. 이는 플래그 테스트와 모드 변경을 무효화할 수 있는 최적화(예: 전역 공통 부분식 제거, 코드 이동, 상수 폴딩)가 금지됨을 의미합니다. 기본값은 구현에 따라 정의되며, 일반적으로 OFF 입니다.
2) 부동 소수점 표현식의 계약 을 허용합니다. 즉, 표현식이 작성된 그대로 정확하게 평가되었을 때 관찰될 수 있는 반올림 오차와 부동 소수점 예외를 생략하는 최적화를 허용합니다. 예를 들어, ( x * y ) + z 를 단일 FMA(Fused Multiply-Add) CPU 명령어로 구현하는 것을 허용합니다. 기본값은 구현에 따라 정의되며, 일반적으로 ON 입니다.
3) 복소수의 곱셈, 나눗셈 및 절댓값 연산이 단순화된 수학 공식 (x+iy)×(u+iv) = (xu-yv)+i(yu+xv) , (x+iy)/(u+iv) = [(xu+yv)+i(yu-xv)]/(u 2
+v 2
)
, 그리고 |x+iy| = x 2
+y 2
을 사용할 수 있음을 컴파일러에 알립니다. 중간 오버플로우 가능성에도 불구하고 사용됩니다. 즉, 프로그래머는 해당 함수에 전달될 값들의 범위가 제한적임을 보장합니다. 기본값은 OFF 입니다.

프로그램의 동작은 위의 세 가지 프라그마(pragma)가 모든 외부 선언 외부 또는 복합문 내부의 모든 명시적 선언과 문장 앞이 아닌 다른 어떤 문맥에서 나타날 경우 정의되지 않습니다.

참고: 이러한 프라그마를 지원하지 않는 컴파일러는 gcc의 -fcx-limited-range -ffp-contract 와 같은 동등한 컴파일 타임 옵션을 제공할 수 있습니다.

#pragma once

#pragma once 는 비표준 프라그마로 대부분의 현대 컴파일러에서 지원됩니다 . 헤더 파일에 나타날 경우, 동일한 소스 파일에서 (직접적 또는 간접적으로) 여러 번 포함되더라도 한 번만 파싱되어야 함을 나타냅니다.

동일한 헤더의 중복 포함을 방지하는 표준적인 접근 방식은 include guards 를 사용하는 것입니다:

#ifndef LIBRARY_FILENAME_H
#define LIBRARY_FILENAME_H
// 헤더 파일 내용
#endif /* LIBRARY_FILENAME_H */

모든 번역 단위에서 헤더의 첫 번째 포함을 제외한 모든 포함이 컴파일에서 제외되도록 합니다. 모든 모던 컴파일러는 헤더 파일이 include guard를 사용한다는 사실을 기록하며, 가드가 여전히 정의되어 있는 한 파일이 다시 발견되더라도 재파싱하지 않습니다(예: gcc 참조).

#pragma once 를 사용하면 동일한 헤더가 다음과 같이 나타납니다

#pragma once
// 헤더 파일 내용

헤더 가드와 달리, 이 프라그마는 둘 이상의 파일에서 동일한 매크로 이름을 오류로 사용하는 것을 불가능하게 합니다. 반면에, #pragma once 는 파일 시스템 수준의 식별자를 기반으로 파일을 제외하기 때문에, 프로젝트 내 여러 위치에 동일 헤더가 존재할 경우 두 번 포함되는 것을 방지할 수 없습니다.

#pragma pack

이 프라그마 패밀리는 이후에 정의될 클래스 및 공용체 멤버들의 최대 정렬을 제어합니다.

#pragma pack( arg ) (1)
#pragma pack() (2)
#pragma pack(push) (3)
#pragma pack(push, arg ) (4)
#pragma pack(pop) (5)

여기서 arg 는 2의 작은 거듭제곱이며 바이트 단위의 새로운 정렬을 지정합니다.

1) 현재 정렬을 값 arg 로 설정합니다.
2) 현재 정렬을 기본값(명령줄 옵션으로 지정된)으로 설정합니다.
3) 현재 정렬 값을 내부 스택에 푸시합니다.
4) 내부 스택에 현재 정렬 값을 푸시한 다음 현재 정렬을 arg 값으로 설정합니다.
5) 내부 스택에서 최상위 항목을 꺼낸 다음 현재 정렬(alignment)을 해당 값으로 설정(복원)합니다.

#pragma pack 는 클래스의 정렬을 감소시킬 수 있지만, 클래스를 과도하게 정렬되게 만들 수는 없습니다.

자세한 내용은 GCC MSVC 에 대한 구체적인 설명을 참조하십시오.

참조문헌

  • C++23 표준 (ISO/IEC 14882:2024):
  • 15.9 Pragma directive [cpp.pragma]
  • C++20 표준(ISO/IEC 14882:2020):
  • 15.9 프라그마 지시문 [cpp.pragma]
  • C++17 표준 (ISO/IEC 14882:2017):
  • 19.6 Pragma 지시어 [cpp.pragma]
  • C++14 표준(ISO/IEC 14882:2014):
  • 16.6 Pragma 지시문 [cpp.pragma]
  • C++11 표준 (ISO/IEC 14882:2011):
  • 16.6 Pragma 지시자 [cpp.pragma]
  • C++98 표준(ISO/IEC 14882:1998):
  • 16.6 프라그마 지시문 [cpp.pragma]

참고 항목

C 문서 for Implementation defined behavior control

외부 링크

1. Visual Studio의 C++ 프라그마
2. 프라그마 GCC에서 지원하는
3. 개별 프라그마 설명 표준 프라그마 IBM AIX XL C 16.1
4. 부록 B. 프라그마 Sun Studio 11 C++ 사용자 가이드
5. Intel C++ 컴파일러 프라그마
6. 릴리스 노드 (프라그마 포함) HP aCC A.06.25