Each implementation of C and C++ supports some features unique to its host machine or operating system. Some programs, for instance, need to exercise precise control over the memory areas where data is placed or to control the way certain functions receive parameters. The #pragma directives offer a way for each compiler to offer machine- and operating-system-specific features while retaining overall compatibility with the C and C++ languages. Pragmas are machine- or operating-system-specific by definition, and are usually different for every compiler.
-- MSDN
C 와 C++ 을 구현한 각각의 컴파일러에는 포팅된 하드웨어나 OS 에 의존적인 몇몇가지들의 기능을 가지고 있다. 일례로 몇몇의 프로그램들은 메모리에 데이터가 어떠한 방식으로 자리잡을 것인지 에 관한 문제나 함수가 파라미터들을 조작하는 방법들에 대한 세밀한 조작이 요구된다. #pragma 지시어들은 C 와 C++ 언어 안에서 최소한의 호환성을 유지시키며 그러한 시스템 의존적인 명령어들을 언어의 기능으로서 포함시키는 일을 한다. Pragma 지시어들은 일반적으로 컴파일러들 마다 서로 다르다.
snowflower는 Accelerated C++ 에 있는 map예제를 Visual C++에서 치면서 엄청난 양의 경고를 경험했다. 이것을 어떻게 할 수 있을까 자료를 찾던 중 다음과 같은 방법을 찾았다.
map에서 나는 경고는 번호 C4786번과 C4788번(identifier가 너무 길어서 나타나는 경고라고 한다) 단 2개 뿐임을 알았고, 결국 소스의 맨 윗줄에
#pragma warning(disable: 4786 4788)
한줄을 추가함으로 해결을 봤다.
NeoCoin 은 Debug 모드에서, 값을 추적할 것을 포기하고, Project Setting -> C/C++ tab -> Debug info -> Line Numbers Only 로 놓고 쓴다.
하지만, 이러한 경고는 Visual C++ 6.0 에서만 유효한것이고, VS.NET 부터 추가 세팅이 필요 없다. VC++ 6.0 에서는 map은 물론
STLPort 나,
Boost 사용하는 것을 권장하지 않는다. 더 이상 MS 측의 컴파일러 기술 지원이 없으므로, VS.NET 이상 버전을 사용해야 한다.
뿐만 아니라 lib의 추가등이라던지 이 파일이 단 한번만 열리게 할 수도 있다.
#pragma comment(lib, "d3dx9") // dx9.lib 파일을 링크시 포함한다.
#pragma once // 이 파일은 한번만 열리게 한다.
혹시라도.. 저 #pragma warning(disable: n ... m) 을 써서 언제나 문제를 해결 할 수 있을거라고 생각하시면 안됩니다. 저 위의 설명에도 씌여있듯이, pragma directive 는 지극히.. 시스템에 의존적입니다. 그러므로, VC 에서는 먹힌다는 저 명령어가 GCC 에서는 안될수도 있고.. 뭐 그런겁니다. 확실하게 쓰고싶으시다면.. 그 컴파일러의 문서를 참조하는것이 도움될겁니다.
표준으로 정해진 몇몇의 pragma directive 가 있다고 알고있는데.. 그것들을 내키면 정리해서 올려보겠습니다.