(토론 과제) #pragma 종류 조사하기

2015. 3. 19. 02:13프로그래밍/지식창고

728x90
728x90

맡은 부분

code_seg, comment, component, conform


1. code_seg

MSDN

기능

함수가 .obj 파일에 저장되는 텍스트 세그먼트를 지정합니다.


형식

#pragma code_seg( [ [ { push | pop }, ] [ identifier, ] ] [ "segment-name" [, "segment-class" ] )


인자 설명

Push(선택적 요소)  내부 컴파일러 스택에 기록합니다. push에는 identifier  segment-name 가질 수 있다.

Pop(선택적 요소) 내부 컴파일러 스택 맨 위에서 기록을 제거한다.

identifier(선택적 요소)

push와 함께 사용할 때 내부 컴파일러 스택의 레코드에 이름을 할당합니다. pop과 함께 사용할 때 identifier가 제거될 때까지 내부 스택에서 레코드를 팝합니다. identifier가 내부 스택에 없으면 아무 것도 팝되지 않습니다.

identifier를 사용하면 한 번의 pop 명령으로 여러 레코드를 팝할 수 있다.

"segment-name"(옵션) 

세그먼트의 이름입니다. 스택은 pop과 함께 사용하면 팝되고 segment-name이 활성 텍스트 세그먼트 이름이 된됩니다.

"segment-class"(옵션) 무시되긴하지만 2.0 이전 버전의 C++ 버전과의 호환성을 위해 포함되었다.


블로그 검색

#pragma code_seg <seg_name> <"seg_class"> <group>
code_seg pragma는 함수들을 위치시킬 group, class 또는 segment의 이름을 줄 수 있도록 지시합니다. 

만일 option없이 사용하였다면 함수의 배치를 위해서 default code segment가 사용됩니다.


2. comment

MSDN

기능

주석 기록을 개체 파일 또는 실행 파일에 배치합니다.


형식

#pragma comment( comment-type [,"commentstring"] )


인자 설명

compiler
컴파일러의 이름 및 버전 이름을 object 파일에 배치합니다. 이 주석 기록은 링커에 의해 무시됩니다.  이 기록 형식에 commentstring 매개 변수를 제공한 경우 컴파일러에서 경고를 생성합니다.

exestr
commentstring을 object 파일에 배치합니다. 이 문자열은 링크 타임에 실행 파일에 배치됩니다. 이 문자열은 실행 파일이 로드될 때 메모리에 로드되지 않지만, 파일 내에 인쇄 가능한 문자열을 찾는 프로그램에서는 발견될 수 있습니다. 이 주석 기록 형식의 용도는 실행 파일의 버전 번호 또는 유사 정보를 포함하는 것입니다.
exestr 은 사용되지 않으며 추후 버전에서 제거됩니다. 따라서 주석 기록은 링커에서 처리되지 않습니다.

lib
라이브러리 검색 기록을 object 파일에 배치합니다. 이러한 주석 형식은 링커가 검색할 라이브러리의 이름(그리고 가능하면 경로까지)을 포함하는 commentstring 매개 변수를 수반해야 합니다.  라이브러리 이름은 object 파일의 기본 라이브러리 검색 기록을 따릅니다. 라이브러리가 /nodefaultlib로 지정되지 않은 경우 링커는 라이브러리 이름이 명령줄에서 명명된 것처럼 이 라이브러리를 검색합니다.  여러 라이브러리 검색 기록을 같은 소스 파일에 배치할 수 있으며 각 기록은 소스 파일과 동일한 순서로 object 파일에 표시됩니다.

기본 라이브러리 및 추가된 라이브러리의 순서가 중요한 경우 /Zl 스위치를 사용하여 컴파일하면 기본 라이브러리 이름이 object 모듈에 배치되지 않습니다.그런 다음 두 번째 주석 pragma를 사용하여 추가된 라이브러리 다음에 기본 라이브러리의 이름을 삽입할 수 있습니다.  pragma를 사용하여 나열된 라이브러리는 소스 코드와 동일한 순서로 object 모듈에 표시됩니다.
링커
링커 옵션을 object 파일에 배치합니다. 이 주석 형식을 이용하여 명령줄에 주석을 전달하거나 개발 환경에 지정하는 대신 링커 옵션을 지정할 수 있습니다.예를 들어, /include 옵션을 지정하면 기호를 포함하도록 할 수 있습니다.


블로그 검색
#pragma comment (comment type, "string")
comment 프라그마는 출력되어지는 file에 주석을 기록시킬것을 지시합니다.
comment type에 올수 있는 값들은 다음중의 하나가 될것입니다.


* compiler

오브젝트(실행) 파일에 컴파일러의 이름과 버전을 추가합니다.

comment string이 없으면 링커는 이 레코드를 무시합니다.


* exestr

linker가 ".OBJ" file에 string을 기록합니다. 이렇게 기록된 string은
실행파일내부에 기록되어지며, 이것은 결코 메모리로 load되지 않습니다.
하지만 적당한 파일 검색 유틸리티를 사용하여 실행파일에서 string을
찾아볼 수 있습니다.

* lib
오브젝트 파일에 library search record에 comment string으로 주어진 라이브러리 이름을 추가합니다.

디폴트 라이브러리처럼 동작하게 됩니다.

library에 새로운 module을 추가하는 경우 에만 comment 프라그마를 사용하여

linker에게 결과 file에 명시할 수 있도록 지시할 수 있습니다. 다시 말하면 기존에 작성되어진 

module에는 comment 프라그마를 사용하여 string을 추가 시킬수 없습니다. 

새롭게 library를 작성한다면 예외일 수 있겠지요.
linker는 최종의 library에서 string에 명시된 library module 이름을 포함 합니다. 

여러개의 module들도 이름지어질 수 있으며 이름을 만들기 위하여 linke되어집니다.


* linker

오브젝트 파일에 linker option을 지정합니다.

* user

오브젝트 파일에 일반적인 주석을 추가합니다.


교수님 지식인 답변

: 이 지시자는 라이브러리를 인클루드 할때 사용을 많이 합니다. 다른 명령들도 사용하는데 대표적인 것들은 compiler, exestr, lib, linker, user 등이 있습니다.

사용방법은 #pragma comment(lib,"msimg32.lib") 와 같이 사용합니다.

기본형식은 #prgma comment( comment_type, "코멘트로 사용할 명령 " )


3. component

MSDN

기능

소스 파일 안에서 브라우저 정보나 종속적인 정보의 수집을 제어합니다.


형식

#pragma component( browser, { on | off }[, references [, name ]] )

#pragma component( minrebuild, on | off )

#pragma component( mintypeinfo, on | off )


인자 설명

browser

수집을 설정하거나 해제할 수 있으며 정보가 수집됨에 따라 특정 이름을 무시하도록 지정할 수 있습니다.

설정 또는 해제를 사용하면 pragma 정방향에서의 찾아보기 정보 수집을 제어합니다.

#pragma component(browser, off) // 컴파일러에서 찾아보기 정보 수집을 중지합니다.


references 

옵션은 name 인수 여부에 관계없이 사용될 수 있습니다.  references를 name 없이 사용하여 참조 수집을 설정

거나 해제합니다(그러나 다른 찾아보기 정보가 계속 수집됨).  예를 들면 다음과 같습니다.


#pragma component(browser, off, references) // 컴파일러에서 참조 정보 수집을 중지합니다.


references name  off와 함께 사용하여 name에 대한 참조가 찾아보기 정보 창에 나타나지 않도록 합니다.  관심 없는 이름 및 형식을 무시하고 찾아보기 정보 파일의 크기를 줄이려면 이 구문을 사용합니다.  예를 들면 다음과 같습니다.


#pragma component(browser, off, references, DWORD) // 해당 지점부터 DWORD에 대한 참조를 무시합니다.

#pragma component(browser, on, references, DWORD) // on을 통해 다시 참조할 수 있습니다.


minimal rebuild

Visual C++ 최소 다시 빌드 기능을 사용하려면 컴파일러에서 C++ 클래스 종속성 정보를 만들고 저장해야 합니다.

이러한 작업은 디스크 공간을 사용합니다.디스크 공간을 절약하기 위해 예를 들어 변하지 않는 헤더 파일에서와 같이 종속성 정보를 수집할 필요가 없을 때마다 #pragma component( minrebuild, off )를 사용할 수 있습니다. 종속성 수집을 다시 설정하기 위해 변하지 않는 클래스 다음에 #pragma component(minrebuild, on)를 삽입합니다.


Reduce Type Information

mintypeinfo 옵션으로 인해 지정된 영역에 대한 디버깅 정보가 감소합니다. 이 정보의 양이 상당하므로 .pdb 및 .obj 파일에 영향을 줍니다.  mintypeinfo 영역에서 클래스 및 구조체를 디버깅할 수 없습니다.  mintypeinfo 옵션을 사용하면 다음 경고가 발생하지 않도록 하는 데 도움이 될 수 있습니다.


4. conform

MSDN

기능

/Zc:forScope 컴파일러 옵션의 런타임 동작을 지정합니다.


형식

#pragma conform(name [, show ] [, on | off ] [ [, push | pop ] [, identifier ] ] )


인자 설명

name
수정할 컴파일러 옵션의 이름을 지정합니다. 올바른 name은 forScope뿐입니다.

show(옵션) 
컴파일하는 동안 경고 메시지를 통해 name의 현재 설정(true 또는 false)이 표시되도록 합니다. 예를 들어 #pragma conform(forScope, show)를 입력합니다.

on, off(옵션) 
name을 on으로 설정하면 /Zc:forScope 컴파일러 옵션이 사용할 수 있도록 설정됩니다. 기본값은 off입니다.

push(옵션) 
name의 현재 값을 내부 컴파일러 스택으로 푸시합니다. identifier를 지정하는 경우 name에 대한 on 또는 off 값을 스택으로 푸시하도록 지정할 수 있습니다.  예를 들어 #pragma conform(forScope, push, myname, on)을 입력합니다.

pop(선택 사항) 
name 값을 내부 컴파일러 스택 맨 위에 있는 값으로 설정한 다음 스택을 팝합니다. 식별자가 pop과 함께 지정된 경우 스택이 identifier가 포함된 레코드를 찾을 때까지 다시 팝되며, 해당 identifier도 팝됩니다. 스택의 다음 레코드에 있는 name에 대한 현재 값이 name에 대한 새 값이 됩니다.  스택의 레코드에 없는 identifier와 함께 팝을 지정하는 경우 pop이 무시됩니다.

identifier(옵션) 
push 또는 pop 명령과 함께 포함될 수 있습니다. identifier를 사용하면 on 또는 off 지정자도 사용할 수 있습니다.


더 알아보기 /Zc:forScope

루프 범위 강제 규칙

Microsoft 확장(/Ze)과 함께 for 루프의 표준 C++ 동작을 구현하는 데 사용됩니다. /Zc:forScope는 기본적으로 설정되어 있습니다.

728x90
반응형