Implementation defined behavior control
구현 정의 동작은 #pragma 지시어에 의해 제어됩니다.
목차 |
구문
#pragma
pragma-params
|
(1) | ||||||||
_Pragma(
string-literal
)
|
(2) | (C++11 이후) | |||||||
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
중 하나입니다.
ON
으로 설정되면, 프로그램이
floating-point environment
에 접근하거나 수정할 것임을 컴파일러에 알립니다. 이는 플래그 테스트와 모드 변경을 무효화할 수 있는 최적화(예: 전역 공통 부분식 제거, 코드 이동, 상수 폴딩)가 금지됨을 의미합니다. 기본값은 구현에 따라 정의되며, 일반적으로
OFF
입니다.
ON
입니다.
+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의 작은 거듭제곱이며 바이트 단위의 새로운 정렬을 지정합니다.
#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 |