Contents
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 뒤에, 영향을 주고 싶은 소스 코드에만 사용해 부작용이 일어나지 않도록 주의 해야 한다.