#pragma

pragma

복수형으로 pragmata 혹은 pragmas로 부른다. 이들은 프로그램의 컴파일에 영향을 주기 위한  지시자들이다.

처음으로 도입된 것은 1983년 Ada 83이었고 그 이후 많은 프로그래민 언어에서 사용되고 있다.

정리

#pragma once

이후 내용이 한번만 컴파일 되도록 한다.

#ifndef를 사용하는 것과 비교했을 때 #ifndef는 비교를 위해 파일을 계속 읽어와야 한다. 하지만 #pragma once는 한번만 읽으면 된다는 것을 아므로 애초에 읽을 필요가 없다.

표준은 아니나 대다수의 컴파일러의 전처리기는 이를 지원한다. GCC에서는 #ifndef를 사용해도 이를 기억해두고 다시 읽지 않는 기능을 추가한 듯 하다.

#pragma optimize

컴파일러의 함수별 최적화 수위를 조절한다.

#pragma optimize( “[optimization-list]”, {on | off} )

이후 나오는 첫번째 함수에 적용된다. [optimization-list]에는 g, s혹은 t, y가 들어갈 수 있다.

  • g : 전역 최적화 활성화
  • s/t : 짧거나 빠른 기계어 시퀀스 지정
  • y : 프로그램 스택에서 프레임 포인터를 생성

빈 문자열을 사용할 시 off 하면 위의 세가지 최적화가 모두 중지되고, on하면 컴파일러 옵션 (/O)로 활성한 항목에 대해 최적화가 활성화 된다.

#pragma runtime_checks

컴파일러에 /RTC옵션을 주었을 경우, 해당 구간에서 끄고 다시 재활성화 한다.

#pragma runtime_checks( “[runtime_checks]”, {restore | off} )

[runtime_checks]에는 s,c,u가 들어갈 수 있다.

  • s : 스택의 확인
  • c : 자기 데이터 타입보다 작은 데이터 타입에 대입하려고 하는지 확인
  • u : undefined 상태에서 변수를 사용하려고 하는지 확인

/RTC가 없는 경우에는 활성화 할 수 없다. 잠시 비활성화 한 것 만을 활성화하기에 on이 아닌 restore.

#pragma pointers_ to_members

C++에서만 사용이 가능한 pragma

#pragma pointers_to_members( pointer-declaration, [most-general-representation] )

연결된 클래스 정의 앞에 클래스 멤버의 포인터를 선언할 수 있으며 이 포인터를 사용하여 포인터 크기 및 포인터를 해석하는 데 필요한 코드를 제어하는지 여부를 지정한다. 상속 키워드 사용에 대한 대안으로 사용할 수 있다.

pointer-declaration

  • full_generality : 최적화되지 않은 코드를 생성하기도 하지만 클래스 정의 앞에 포인터가 선언되는 경우 사용한다.
  • best_case : 최적화된 코드를 생성하지만 클래스 정의가 미리 되어 있어야 한다.

most-general-representation

  • single_inheritance : 단일 상속. 상속 모델이 다중 혹은 가상이라면 에러 발생.
  • multiple_inheritance : 다중 상속. 상속 모델이 가상일 경우 에러 발생.
  • virtual_inheritance : 가상 상속. 상속 모델에 따른 에러는 발생하지 않으며 full_generality에 대한 기본 인수이다.

이 pragma는 #include 뒤에, 영향을 주고 싶은 소스 코드에만 사용해 부작용이 일어나지 않도록 주의 해야 한다.

Leave a Reply