#pragma
Precomplier 즉 전처리기로서 컴파일 하기 이전에 해당 명령을 처리해주는 명령어이다.
Visual C++에는 다양한 프로젝트 옵션 등이 제공되지만
혹여 다른 컴파일러를 사용할 경우도 생길지 모르니
옵션 위주보다는 #pragma를 사용하는 것을 권장한다.
몇가지 옵션을 소개한다.
#pragma once : 해당 소스가 단 한번만 포함되게 한다.
- 여러번 include 되는 것을 방지하며 이 파일은 한번만 포함되는 것을 알 수 있다.
#ifndef #endif 와 같은 방식이다.
#pragma pack : 구조체의 정렬 방식을 지정한다.
- 제어문 종류 :: pack(n) : n으로 정렬 방식을 바꾼다.
default : Default 정렬 방식을 바꾼다.
pack(push, n) : n으로 정렬 방식을 바꾸고 기존 정렬 방식은 스택에 저장한다.
pop : 스택에 저장한 정렬방식으로 다시 돌린다.
여기서 n은 컴파일러가 저장된 메모리에 데이터를 정렬하는 방법을 결정하는 바이트 크기이다.
보통은 4바이트이다.
ex) #pragma pack(1)
typedef struct
{
char ch1; // 1바이트
char ch2; // 1바이트
char* pchar; // 4바이트
int a; // 4바이트
int* pa; // 4바이트
}STUDENT, *LP_STUDENT;
#pragma pack() 이 경우 구조체의 크기는 14바이트여야 하나 실제로 sizeof()를 구해보면 16바이트이다. 이 때 pack을 사용하면 빈공간없이 14바이트로 구조체를 사용할 수 있다.
#pragma data_seg : dll에서 데이터를 공유하고자 할 때 사용된다.
#pragma warning : 컴파일시 나오는 경고를 설정한다.
- 제어문 종류 : once : 번호 -> 반복되는 경고를 한번만 출력
default : 번호 -> 원래 설정대로 되돌린다.
disable : 번호 -> 경고 출력을 하지 않는다.
error : 번호 -> 경고를 에러로 처리한다.
level : 번호 -> 경고의 레벨을 변경한다.
push[, n] -> 모든 경고의 레벨을 저장한다. n이 있을 경우 저장과 동시에 전역 경고 레벨을 n으로 변경한다.
pop -> 스택에 마지막으로 저장된 경고 레벨을 복원한다.
ex) #pragma warning(disable : 4244)
- 4244번의 Warning에 대한 경고를 표시하지 않는다.
#pragma warning(3 : 4244)
- 4244번 경고를 레벨 3으로 올린다.
#pragma message("Hello") : 컴파일 시 특정 문장을 표시하게 한다.
ex)
#define __DISMSG__(x) #x
#define __PREFIX__(x) __DISMSG__(x)
#define __WARNING__ __FILE__ "("__PREFIX__(__LINE__)") warning : "
#define __ERROR__ __FILE__ "("__PREFIX__(__LINE__)") error : "
#pragma message(">> compliing begin point...")
int main()
{
char szMsg[100];
memset(szMsg, 0x00, sizeof(szMsg));
strcpy(szMsg, "helloworld");
#pragma message(">> "__WARNING__ "strcpy로 하면 안전하지 않다.")
printf("%s\n", szMsg);
}
#pragma message(">> compliing end point...")
#pragma intrinsic(함수명1, 함수명2) : 해당 함수를 호출시 function call이 아닌 inline 형식으로 코드자체를 함수 사용하는 장소에
삽입시켜 최적화를 시켜준다.
#pragma function(함수명1, 함수명2) : 해당 함수를 function call 형태로 구현되도록 지시한다.
둘중에 하나를 선언 후 다시 변경할 때까지 pragma가 기술된 첫 함수부터 영향을 미쳐 소스
코드의 마지막 라인까지 영향을미친다.
#pragma comment(lib, "링크명.lib") : 해당 dll이나 라이브러리를 링커에 포함시키도록 한다.
#pragma optimize("옵션", on/off) : 함수 밖에 선언이 되며 pragma가 선언된 후 정의된 첫 번째 함수
에 영향을 미치도록 한다.
옵션 - g : 전역 최적화 옵션을 활성화
- p : Floating Point의 Consistency를 향상시킨다.
- s or t :
- y : 프로그램 스택의 프레임 포인터를 일반화 시킨다.
- 옵션의 아무것도 주지 않고 뒤에 파라미터를 사용시 모든 옵션에 대해 설정이 적용된다.
ex) #pragma optimize("", on)
#pragma optimize("tp", off)
#pragma region & endregion : 멤버 함수나 변수들을 일정한 분류를 시켜준다. 해당 영역을 줄이거나
확장시켜 코드의 가독성을 높일 수 있다.
ex) #pragma region 테스트용 함수들
void Test1() {}
void Test2() {}
void Test3() {}
#pragma endregion 테스트용 함수들
더 자세한건 msdn을 찾아보자.
http://msdn.microsoft.com/ko-kr/library/h7k3a0bw.aspx
'Basic Programming > C, C++' 카테고리의 다른 글
C++ - Effectvice C++의 55가지 테크닉 Part - 1 (0) | 2016.03.03 |
---|---|
C++ - ++i 와 i++의 차이 (0) | 2016.03.03 |
C++ - 멤버 이니셜라이져(Member Initializer) (0) | 2016.03.03 |
C++ - ZeroMemory와 memset의 차이 (0) | 2016.03.03 |
C++ - volatile 과 register 키워드 (0) | 2016.03.03 |