#pragma 는 #로 시작하는 Precompiler(전처리구문) 지시자중 하나이다.
컴파일러에 종속적인 명령으로, 컴파일러에 직접 정보를 전하기 위해 사용하는데,
컴파일러에 종속적이기 때문에 컴파일러는 변경했을 경우 실행을 보장하진 못한다.
#pragma 명령어 중 자주 쓰이는 once 와 comment()에 대해서 알아보자.
1. #pragma once
#pragma once 는 C의 헤더 파일 최상단에서 자주 볼 수 있는데, 컴파일러에게 해당 헤더 파일이 한번만
빌드되도록 알려주는 명령이다. 즉, 여러번 인클루드 되는 것을 컴파일러 차원에서 막아주게 된다.
예를 들어, A.h라는 파일이 여러 곳에서 복잡하게 #include 되어 쓰이게 된다면 그때마다 가각 정의가
추가되게 되어 중첩되는 경우가 생긴다. 이 경우 중복 정의되었다는 에러가 발생하게 된다.
즉, 같은 내용이 여러번 빌드되게 되는 것을 막기위해 #pragma once 를 사용하는 것이다.
참고:
중복 정의에 대한 에러를 막기 위해 #ifndef 문을 써도 된다.
사용 예) 헤더파일 부분에
#ifndef _A
#define _A
// 헤더파일 내용
#endif
2. #pragma comment()
#pragma comment()로 사용할 수 있는 명령은 여러 개가 있는데, 그 중 가장 대표적인 것이
#pragma comment(lib, "*.ilb")로 해당 라이브러리를 링크 시켜준다.
예를 들어 VC++6.0에서 DirectDraw를 사용하기 위해서는 Project>>Settings의 Link 탭으로 이동하여
Object/library modules 항목란에 ddraw.lib 와 dxguid.lib를 적어 넣어 lib 파일을 링크해 줘야 한다.
하지만,
#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "ddraw.lib")
와 같이 소스코드 내에서 명시적으로 지정을 하면, Project>>Settings... 의 과정을 거치지 않고도 라이브러리를
링크할 수 있다.
3. #pragma warning(disable : 4200)
#pragma warning 경고 메시지와 관련된 지시자로서
#pragma warning(disable : 4786)
#pragma warning(disable : 4100)
이렇게 소스 파일에 적어놓으면 이 지시자가 나타난 순간부터 각각 4786, 4100번의 경고 메시지를 출력하지 못하게 합니다. MS 컴파일러에서 각각의 경고 메시지는 자신의 고유번호를 갖고 있습니다. 예를 들어 다음 소스를 경고레벨 4에서 컴파일한다면,
void f(int a)
{
}
int main()
{
return 0;
}
다음과 같은 메시지를 출력합니다.
e:\Temp Projects\Test2\Test2.cpp(6) : warning C4100: 'a' : 참조되지 않은 형식 매개 변수입니다.
이때 C4100이 바로 경고메시지의 고유번호입니다.
C는 컴파일러에서 발생했다는 뜻이며, 4100이 경고 메시지 번호입니다.
이런 경고 메시지가 많이 발생되는 경우, 컴파일 속도가 심각하게 느려질수 있습니다.
또, 깨끗한 프로그램을 위해 경고레벨4에서 경고메시지 없이 컴파일 되기를 원하는 개발사도 있습니다. 이럴때, 다음처럼 해당 경고를 삭제해 주는 것입니다.
#pragma warning(disable: 4100)
void f(int a)
{
}
int main()
{
return 0;
}
위의 소스는 실제로는 경고메시지를 끄는 것 보다는 경고메시지의 근본적인 오류를 제거해야 할 것입니다. 무슨말이냐하면, 실제로 f라는 함수에서 a라는 매개변수를 사용하지 않기 때문에, 매개 변수를 없애던가, 함수내부에서 매개변수를 사용하게끔 하던가, 혹은 나중에 사용하기 위해 설계상 써놓은 것이라면, 다음처럼 소스를 수정합니다.
void f(int /* a 차후에 사용될 것임을 명시하는 주석문*/)
{
}
또는
void f(int a)
{
a; // 차후에 사용될 것임을 명시하는 주석문.
}
하지만, 위 4786번 메시지의 경우 STL과 관련된 VC++6.0의 버그로서, 이 경우에는 어쩔수 없이 삭제해 주어야 합니다.