달력

112024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

Visual C++ 로 작성된 코드가 vs6, vs2003, vs2005, vs2008, vs2010 에서
error나 warning 없이 컴파일 되게 하려면 각기 다른 코드로 작성해야 하는데 
이것을 구분하기 위해서 따로 전처리기 변수를 정의할 필요 없이 _MSC_VER를 사용하면 된다.

_MSC_VER 로 Visual Studio 컴파일러 버전을 알 수 있으며
_MSC_VER 이 정의되어있지 않다면 Unix 계열의 C++로 판단할 수 있을 것 같다.

_MSC_VER
 _MSC_VER 값  컴파일러 버전  Visual Studio 버전
 ( _MSC_VER => 1000 )  4.0  
 ( _MSC_VER => 1100 )  5.0  
 ( _MSC_VER => 1200 )  6.0  vs6
 ( _MSC_VER => 1310 )  7.1  vs2003
 ( _MSC_VER => 1400 )  8.0  vs2005
 ( _MSC_VER => 1500 )  9.0  vs2008
 ( _MSC_VER => 1600 )  10.0  vs2010


사용예를 들자면 vs6에는 _tfopsn_s() 가 없어서 fopen()를 사용하면 vs2008에서 컴파일시 warning이 발생한다.
이때, _MSC_VER 를 사용해 컴파일러마다 다른 코드를 사용하게끔 만들 수 있다. 
 
#if defined( _MSC_VER )
    #if( _MSC_VER < 1310)    // vs6
        pFile = fopen(szFile, "r");
        if( pFile == NULL )
        {
            return false;
        }
        //
 
    #elif( _MSC_VER < 1400)  // vs2003
        pFile = _tfopen(szFile, _T("r"));
        if( pFile == NULL )
        {
            return false;
        }
        //
    #else                   // vs2005 이상
        errno_t eno = _tfopen_s(&pFile, szFile, _T("r"));
        if( pFile == NULL || eno != 0 )
        {
            return false;
        }
    #endif
#endif
컴파일러 버전별로 Static Library를 배포해야 할 경우 이런 코드가 나올 수 밖에 없다.
C++ Open Source 라이브러리 코드도 이런식으로 사용하기는 마찬가지.. 

출처 : http://yamoe.tistory.com/
Posted by 위너즈
|