-P -Q -S
-T -Uname -V
-X -Y
다음의 경우에 #pragmas, #indluces, #define과 약간의 #ifs를 사용할 수
있습니다.
* #if, #ifdef, #ifndef 또는 #elif지시어 내에서 두 밑줄로 시작하는 매크로명
(그리고 그에 따른 내장 매크로도 가능합니다.)의 사용 전.
* 첫번째 실재 token이 발생하기 전(첫번째 C 또는 C++ 선언문)
특정 명령 라인 옵션은 이들 사건 앞의 #pragma option 내에서만 나타날 수
있는데 그러한 option들은 다음과 같습니다.
-Efilename -f -i#
-m* -npath -ofilename
-u -W -z
다른 option들은 어디서나 변경될 수 있는데 다음 option들은 함수 또는 대상
선언문 사이에서 변경될 경우 컴파일러에만 영향을 미칩니다.
-1 -h -r
-2 -k -rd
-a -N -v
-ff -O -y
-G -p -Z
다음의 option들은 언제든지 변경될 수 있으며 즉시 영향을 미칠 수 있습니다.
-A -gn -zE
-b -jn -zF
-C -K -zH
-d -wxxx
이들 option들은 그 명령 라인 상태로 재설정하기 위해 점(.)앞에 추가로
나타날 수 있습니다.
push 또는 pop을 사용한 #pragma option
18:41, 21 February 2007 (PST)18:41, 21 February 2007 (PST)18:41, 21 February 2007 (PST)18:41, 21 February 2007 (PST)18:41, 21 February 2007 (PST)18:41, 21 February 2007 (PST)18:41, 21 February 2007 (PST)~~
또한 콤파일러 지시어들을 쉽게 변경할 수 있도록 push 그리고 pop 아규먼트들
과 함께 #pragma option 지시어를 사용할 수도 있습니다.
잠재적으로 많은 컴파일러 옵션과 경고들을 변경하는 파일들을 포함하기 위해
#pragma option push를 사용할 수 있고, #pragma option pop은 단일 문장으로서
이전의 상태를 되돌려준다. 예를 들자면 다음과 같다.
#pragma option push
#include <theworld.h>
#pragma option pop
#include "mystuff.h"
#pragma option push 지시어는 첫번째로 모든 콤파일러 옵션들과 경고 설정들을
스택에 push한 후에 다른 옵션들이 존재한다면 이를 처리한다. 다음의 예는
#pragma option push가 옵션들을 사용하거나 혹은 그렇지 않을수 있음을
보여줍니다.
#pragma option push -C -A
#pragma option push
#pragma option pop directive은 스택으로부터 옵션들과 경고들의 마지막 설정
을 pop함으로서 컴파일러 옵션과 경고들을 변경합니다. 만일 스택이 비어있고
option pop과 일치하는 option push가 없으며 아무것도 발생하지 않은경우
경고가 주어집니다. 다음은 빈 스택에대해서 경고를 발생시킵니다.
#pragma option push
#pragma option pop
#pragma option pop /* 경고가 발생합니다.
권장하지는 않지만 지시어를 사용하여 이 경고를 off시킬 수 있습니다.
#pragma warn -nop.
만일 pop의 다음에 어떤 옵셥들을 명시할려고 한다면 에러가 발생하게되며
pragma option pop 다음에는 어떤것도 허락하지 않습니다. 예를 들면, 다음은
에러를 발생합니다.
#pragma option pop -C /* ERROR
만일 push된 옵션들의 스택이 파일의 시작과 마지막이 동일하지 않다면
다음과 같은 경고메세지가 발생합니다.
Previous options and warnings not restored.
이 경고메세지를 off시키기 위하여 지시어 #pragma nopushoptwarn를 사용할
수 있습니다.
//--------------------------------------------------------------------------
14. #pragma pack
변수 정렬을 인위적으로 변경시킨다.(보통은 4바이트로 지정되어 있다.)
. 사용법
#pragma pack(n)
위에서, n의 값으로, 1,2,4,8등이 올수 있으며, 특히 네트웍통신쪽을 개발할때
구조체의 멤버들 align할때 사용하는 것으로서, 빈번하게 사용됩니다.
구조체 정렬부분은 중요하지만, 여기서는 그쪽까지 언급하기에는 양이 많아서
여기까지만 설명함.
#pragma pack(push, n)
#pragma pack(pop)
. #pragma pack 지시어는 콤파일러 옵션 -a와 함께 #pragma option을 사용하는
것과 동일합니다. n은 콤파일러가 저장된 메모리에 데이터를 정렬하는 방법을
결정하는 byte의 정렬이다. 보다 자세한 사항은 -a 콤파일러 옵션에 관한
내용을 참고하십시요. #pragma pack은 또한 #pragma option지시어에 push나
pop을 사용하는것과 동일한 기능을 제공 하도록 push나 pop 아규먼트와 함께
사용할 수 있습니다. 아래의 내용은 #pragma pack과 #pragma option을 비교한
내용입니다.
━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━
#pragma pack ┃ #pragma option
━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━
#pragma pack(n) ┃ #pragma option -an
#pragma pack(push, n) ┃ #pragma option push -an
#pragma pack(pop) ┃ #pragma option pop
━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━
예) #pragma pack(push, before_pack, 1)
구조체 정렬을 1 바이트로 만든다. 1 바이트로 맞추기 전의 정렬 기준을 before_pack에 저장한다
#pragma pack(pop, before_pack)
위와 같이 한쌍으로 사용된다. before_pack에 저장된 정렬 기준으로 복원한다.
다음과 같이 사용할 수도 있다.
#pragma pack(push, 1)
#pragma pack(pop)
다음과 같이 복원없이 지정할 수도 있다.
#pragma pack(1)
예) #pragma pack(pop) 이라...아마 이거랑 쌍이 되는게 있을텐데요
#pragma pack(push,1) 이라던지요.
이건 구조체를 1바이트로 바이트 정렬하는 겁니다. 디폴트로는 8바이트로 되어 있을겁니다.
뭐 구조체 크기가 실제로 계산한 것과 맞지 않는 경우가 있는데..이 바이트 정렬 떄문입니다.
따라서..반드시 맞아야 할 경우는... 위의 코드를 구조체 아래위로 써야 합니다.
//--------------------------------------------------------------------------
15.#pragma package
. 사용법
#pragma package(smart_init)
#pragma package(smart_init, weak)
. smart_init 아규먼트
#pragma package(smart_init)는 패키지된 유닛들이 의존할 순서를 결정하기위해
초기화 되어집니다.(패키지 소스파일 내에 기본적으로 포함됩니다.)
일반적으로, 패키지들을 생성하는 .CPP 파일들에 #pragma package를 사용할 수
있습니다.
이 프라크마는 유닛을 콤파일하는기위한 초기의 순서에 영향을 미칩니다.
초기화는 다음의 순서에 의하여 발생합니다.
1. 만일 unitA가 unitB에 의존한다면 unitB는 반드시 unitA전에 초기화
되어져야만하는 사용("uses")에 의존합니다.
2. 링크의 순서(The link order)
3. unit에서의 우선권의 순서.(Priority order within the unit.)
보통의 .OBJ 파일들은(unit들로 생성하지 않은), 첫째로 우선권의 순서에 따라
초기화가 일어나고서 링크가 됩니다. .OBJ 파일들의 링크 순서의 변경은
글로발 오브젝트가 호출되어져 생성되는 순서에 의해 변경됩니다.
다음의 예는 보통의 .OBJ 파일들과 unit들의 초기화에 어떤 차이점이 있는가를
보여줍니다. 세개의 unit 파일들 A,B,C가 #pragma package(smart_init)를
사용하여 "smart initialized"되고 우선권은 10, 20, 30의 값을 갖는다고
예를 듭니다. 함수는 우선권의 값과 parent .OBJ에 의하여 이름지어져 a10,
a20, a30, b10등과 같은 이름을 갖습니다. 세가지는 모두 unit들이며 A는 B와
C를 사용하며 A,B,C의 순서로 링크되고 초기화의 순서는 다음과 같습니다.
B10 B20 B30 C10 C20 C30 A10 A20 A30
위와 같이 되었다면 .OBJ 파일들은 (unit들이 아니다)다음의 순서가 되어질
것입니다.
A10 B10 C10 A20 B20 C20 A30 B30 C30
#pragma package(smart_init)를 사용한 .CPP 파일들은 또한 #pragma package
(smart_init)를 정의한 .CPP 파일로부터 다른 .OBJ 파일들을 참조하는 #pragma
link를 필요로 하며 unit에 의해 결정되어져야만 합니다. #pragma link는, 결정
되지 않은 .OBJ는 라이브러리 등에 의하여 여전히 결정되어질 수 있도록 참조
할 수 있습니다.
. weak packages
#pragma package(smart_init, weak)지시어는 .OBJ 파일이 패키지의 .BPI와
.BPL 파일들에 정장되는 방법에 영향을 미칩니다. 만일 #pragma package(smart_
init, weak)가 unit파일 내에 나타난다면 콤파일러는 가능하다면 BPL들로부터
unit을 생략하고, 다른 에플리케이션이나 패키지에 의해 필요로 할 때면
비 패키지화된(non-packaged) 로칼 복사본의 unit을 생성합니다. 유닛이 이
지시어와 함께 콤파일 되었다는 것은 약하게 패키지화 되었음을 이야기 합니다.
("weakly packaged")
#pragma package(smart_init, weak)는 동일한 외부 라이브러리(external librar
y)들에 의존할수 있는 여러 패키지들 사이에서의 충돌을 제거하는데 사용되어
집니다. #pragma package(smart_init, weak) 지시어를 가지는 unit 파일들은
글로발 변수들을 갖지 않아야 합니다.
//--------------------------------------------------------------------------
16.#pragma resource
. 사용법
#pragma resource "*.dfm"
. 이 프라그마는 form unit에 의해 선정되어지는 파일로서 일치되는 .DFM 파일과
헤더파일을 필요로 합니다. 이러한 모든 파일들은 IDE에 의해 관리되어집니다.
만일 폼을 위한 다른 변수들을 필요로한다면 pragma resource가 사용되어지고난
후에 즉시 선언되어져야만 합니다. 선언은 반드시 form이 되어져야만 합니다.
TFormName *Formname;
//--------------------------------------------------------------------------
17.#pragma startup
. 사용법
#pragma startup function-name <priority>
#pragma exit function-name <priority>
. #pragma exit의 내용을 참조하십시요.
//--------------------------------------------------------------------------
18.#pragma warn
. 사용법
#pragma warn [+:-:.]www
. warn지시어를 이용하면 특정 명령라인 옵션 -wxxx를 우선할 수 있습니다.
#pragma warn -aus 스위치를 사용하면 함수 단위로 취급됩니다. 개별적인
변수들을 위해서 함수 내부에서 경고를 off시킬수는 없습니다. 함수 전체를
off시키거나 혹은 그렇지 않거나 둘중 하나입니다.
ex)
#pragma warn +xxx
#pragma warn -yyy
#pragma warn .zzz
위의 예에서는 xxx경고문은 on되고 yyy경고문은 off되며 zzz경고문은 파일의
컴파일이 시작할 때 갖고 있던 값으로 재저장됩니다.
//----- End of Document ----------------------------------------------------
19. #pragma once
1. 한번 컴파일 되면 더 이상 컴파일 하지 않는다는 뜻입니다.
여러개의 cpp파일이 있을때, 하나의 cpp화일이 수정되면, 그 화일만 컴파일하고
나머지는 하지말아란 뜻이죠. ( 여러 번 인클루드 되는 것을 컴파일러 차원에서 막아줌 )
2. #ifndef ~ #endif 와 같은 역할을 한다.
3. 매크로들의 중복 정의를 막고, 전역변수에 static 키워드를 써줄 필요가 없어짐.
4. VC++ 에서는 되고, 다른 컴파일러는 안될 수도 있음.
5. 분할 컴파일시
이것을 사용하면 빌드시 컴파일러에 의해 해당 파일을 단 한번만 열게 된다... 그러므로 컴파일 타임을 줄일 수 있고 모듈에서 가장 먼저 나온 #include문에서 해당 파일을 열게 되므로 재정의에 의한 오류를 방지할 수 있다...
예제)
// exam.h file
#ifndef __EXAM__
#define __EXAM__
...
#endif
->
// exam.h file
#pragma once
...
//--------------------------------------------------------------------------
20. #pragma data_seg
dll에서 데이터 공유하고자 할 때 쓰임
예) 실행파일에는 코드영역과 데이터영역이 구분되어 있다는 것은 아시지요.
┌───────----┐
│ │
│ │
│ 데이터영역 │
│ │
│ │
├─────----──┤
│ │
│ │
│ 코드 영역 │
│ │
│ │
└──────----─┘
이런 식의 그림은 아마 어디선가 많이 보셨을겁니다.(그림이 깨지네요.편집할 땐 제대로 보였는데...)
이런 영역을 section이라고 하지요. 위의 설명에 나오는 section이라는 용어가 이것입니다.
실제로 데이터 영역과 코드 영역외에도 exe나 dll에는 여러 section을 포함할 수 있습니다.
이건 dumpbin이라는 툴로 살펴볼 수 있습니다.
제 컴(Windows XP)에서 dumpbin c:\windows\notepadd.exe 를 해 보았더니
2000 .data
2000 .rsrc
7000 .text
이렇게 나오는 군요.
여기서 .data에는 초기화된 데이터가 .rsrc에는 리소스들이, .text에 코드가 들어갑니다.
이러한 .data, .rsrc, .text 등은 일반적으로 정해져 있는 것들입니다.
위 MSDN의 설명에 있는 section-name이라는 것이 바로 .data, .rsrc, .text 등을 뜻하는 겁니다.
즉, #pragma code_seg( .data ) 처럼 사용한다는 거지요.
그리고 Specifies a code section where functions are to be allocated.라는 설명은 Specifies a section where functions or data or etc. are to be allocated. 이렇게 이해하면 더 나을 듯 하네요.
그런데 이런 정해진 이름말고도 사용자가 새로운 영역을 정할 수 있습니다.
#pragma data_seg("Shared")
DWORD g_dwThreadIdPMRestore = 0;
HWND g_hwnd = NULL;
#pragma data_seg()
이런 식으로 하면 g_dwThreadIdPMRestored와 g_hwnd가 디폴트 데이터 섹션인 .data에 배치되지 않고, Shared라는 이름으로 만들어진 섹션에 배치되는 것입니다.
//--------------------------------------------------------------------------
21. #pragma warning
컴파일시에 어떤 조건(#if, #ifndef)에의해 개발자에게 어떤것을 알려주고 싶을 경우 사용.
예) #pragma warning(disable:xxxx)
지정된 xxxx번대의 경고 메세지를 디스플레이하는 것을 막는다. (xxxx는 번호)
warning( disable : 4705 )
: 특정 warnning 을 체크하지 않음, 이럴 경우 4705번 warnning은 나타나지 않는다
#pragma warning(default:xxxx)
지정된 xxxx번의 경고 메세지의 설정을 원래의 프로젝트 설정으로 복원한다
//--------------------------------------------------------------------------
22. #pragma code_seg
MSDN에 있는 내용
#pragma code_seg( ["section-name"[,"section-class"] ] )
Specifies a code section where functions are to be allocated. The code_seg pragma specifies the default section for functions. You can, optionally, specify the class as well as the section name. Using #pragma code_seg without a section-name string resets allocation to whatever it was when compilation began.
//--------------------------------------------------------------------------
23. #pragma deprecated
C#의 Obsolete attribute와 비슷한 의미입니다.
즉, 경고가 발생한 클래스 혹은 메서드 등이 이후에는 지원되지 않음을 나타내는 의미입니다.
그러므로 당장은 문제가 없습니다.
컴파일러 specific 한..그런 옵션 지시자라고 보시면 됩니다.
출처 : http://kyh1026.tistory.com/79