Pragma 지시문 및 __Pragma 키워드

 

Visual Studio 2017 에 대한 최신 설명서는 Visual Studio 2017 설명서를 참조하세요.

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를 인식합니다.

alloc_textauto_inlinebss_seg
check_stackcode_segcomment
componentconform 1const_seg
data_segdeprecateddetect_mismatch
fenv_accessfloat_controlfp_contract
functionhdrstopinclude_alias
init_seg 1inline_depthinline_recursion
intrinsicloop 1make_public
managedmessage
omponce
optimizepackpointers_to_members 1
pop_macropush_macroregion, endregion
runtime_checkssectionsetlocale
strict_gs_checkunmanagedvtordisp 1
warning
  1. C++ 컴파일러에서만 지원됩니다.

일부 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>  

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 전용

C/C++ 전처리기 참조
C Pragma
C++ 키워드

표시: