Pragma 지시문 및 __Pragma 키워드
Pragma 지시문이 컴퓨터 또는 운영 체제 관련 컴파일러 기능을 지정합니다. Microsoft 컴파일러 전용인 __pragma 키워드를 사용하여 매크로 정의 안에 pragma 지시문을 코딩할 수 있습니다.
#pragma token-string
__pragma(token-string)
설명
C 및 C++의 각 구현은 호스트 컴퓨터나 운영 체제에 고유한 기능을 몇 가지 지원합니다. 예를 들어, 일부 프로그램은 데이터가 저장되는 메모리 영역을 정확하게 제어하거나 특정 함수가 매개 변수를 수신하는 방법을 제어해야 합니다. #pragma 지시문을 사용하면 C 및 C++ 언어와 전체적인 호환성을 유지하면서 컴파일러가 컴퓨터 및 운영 체제별 기능을 제공할 수 있습니다.
Pragma는 정의에 따라 컴퓨터 전용이거나 운영 체제 전용이며 대개 컴파일러마다 다릅니다. Pragma를 조건문에 사용하여 새로운 전처리기 기능을 제공하거나 구현 정의 정보를 컴파일러에 제공할 수 있습니다.
token-string은 특정 컴파일러 명령과 인수를 제공하는(있을 경우) 일련의 문자입니다. pragma가 포함된 줄에서 숫자 기호(#)가 공백이 아닌 첫 번째 문자여야 합니다. 공백 문자로 숫자 기호와 단어 "pragma"를 구분할 수 있습니다. #pragma 뒤에는 변환기가 전처리 토큰으로 구문 분석할 수 있는 텍스트를 씁니다. #pragma의 인수에는 매크로 확장이 적용됩니다.
컴파일러가 인식할 수 없는 pragma를 찾으면 경고를 표시하고 컴파일을 계속합니다.
Microsoft C 및 C++ 컴파일러는 다음 pragma를 인식합니다.
loop1 |
||
1. C++ 컴파일러에서만 지원됩니다.
Pragma 및 컴파일러 옵션
일부 pragma는 컴파일러 옵션과 같은 기능을 제공합니다. 소스 코드에 pragma가 발생하면 컴파일러 옵션에 지정된 동작을 재정의합니다. 예를 들어, /Zp8을 지정한 경우 pack 코드의 특정 섹션에 대해 이 컴파일러 설정을 재정의할 수 있습니다.
cl /Zp8 ...
<file> - packing is 8
// ...
#pragma pack(push, 1) - packing is now 1
// ...
#pragma pack(pop) - packing is 8
</file>
__pragma() 키워드
Microsoft 전용
컴파일러는 #pragma 지시문과 기능이 같지만 매크로 정의에서 인라인으로 사용할 수 있는 __pragma 키워드를 지원합니다. 컴파일러는 지시문의 숫자 기호 문자('#')를 stringizing 연산자(#)로 해석하기 때문에 매크로 정의에서 #pragma 지시문을 사용할 수 없습니다.
다음 코드 예제에서는 __pragma 키워드를 매크로에서 사용하는 방법을 보여 줍니다. 이 코드는 "컴파일러 COM 지원 샘플"의 ACDUAL 샘플에 있는 mfcdual.h 헤더에서 발췌되었습니다.
#define CATCH_ALL_DUAL \
CATCH(COleException, e) \
{ \
_hr = e->m_sc; \
} \
AND_CATCH_ALL(e) \
{ \
__pragma(warning(push)) \
__pragma(warning(disable:6246)) /*disable _ctlState prefast warning*/ \
AFX_MANAGE_STATE(pThis->m_pModuleState); \
__pragma(warning(pop)) \
_hr = DualHandleException(_riidSource, e); \
} \
END_CATCH_ALL \
return _hr; \
End Microsoft 전용