6

시스템 호출을 포함하는 C++에서 크로스 플랫폼 함수를 작성하고 싶습니다. 코드를 컴파일 할 운영 체제를 확인하기 위해 조건부 컴파일 플래그를 확인할 수 있습니까? 저는 주로 Visual Studio와 GCC를 사용하여 Windows와 Linux에 관심이 있습니다.운영체제 기반 C++의 조건부 컴파일

void SomeClass::SomeFunction() 
{ 
    // Other code 

#ifdef LINUX 
    LinuxSystemCall(); 
#endif 

#ifdef WINDOWS 
    WindowsSystemCall(); 
#endif 

    // Other code 
} 

답변

7

내 GCC (4.3.3)는 다음 Linux와 관련된 사전 정의 된 매크로 정의 : VC에서

$ gcc -dM -E - < /dev/null | grep -i linux 
#define __linux 1 
#define __linux__ 1 
#define __gnu_linux__ 1 
#define linux 1 

를 ++ (그리고 다른 많은 Win32에서

나는 그것을 같이 보일한다고 생각합니다 컴파일러) 플랫폼을 식별하는 몇 가지 미리 정의 된 매크로, 특히 _WIN32가 있습니다. 세부 정보 : http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx

+3

- _WIN64에 대한 Win64를 위해 컴파일 할 때 당신이 _WIN32이 정의되어 있는지 찾을 수 있도록 테스트는 테스트 전에 (!) against _WIN32 –

7

표준 방법이 없습니다. 플랫폼별로 정의 된 특정 매크로를 키 오프 할 수 있습니다. 예를 들어 _WIN32는 Windows에서 정의되며 Linux에서는 거의 정의되지 않습니다. 그러나 나는 해당 리눅스 매크로를 모른다.

별도의 컴파일러를 사용하기 때문에 별도의 빌드 환경이 필요합니다. 매크로를 직접 추가하지 않는 것이 어떻습니까? Visual Studio와 GCC 모두 커맨드 라인에서 매크로를 정의 할 수 있도록 지원합니다.

+0

나는 이것을 위해 가장 일반적인 매크로를 사용하고 싶다. 아마도 컴파일러 자체가 정의한 기본값이 좋을 것이다. _WIN32와 리눅스가 내 용도로 충분할 것으로 보인다. –

+1

물론, BSD와 다른 유닉스의 맛을 위해서도 효과가 있을까요? makefile (빌드 시스템 등)에서 직접 정의하는 것이 가장 좋습니다. 불만이라면 #ifdef _WIN32 #define PLATFORM "Windows"#endif와 같은 코드로 보호하십시오 #ifndef PLATFORM #error PLATFORM undefined - 구성 확인 #endif – plinth

5

난 항상 이런 식으로 수행하여 주요 코드에서 플랫폼 특성을 유지하려고

platform.h :

#if BUILD_PLATFORM == WINDOWS_BUILD 
#include "windows_platform.h" 
#elif BUILD_PLATFORM == LINUX_BUILD 
#include "linux_platform.h" 
#else 
#error UNSUPPORTED PLATFORM 
#endif 

someclass.c : 이제

void SomeClass::SomeFunction() 
{ 
    system_related_type t; 
    // Other code 
    platform_SystemCall(&t); 
    // Other code 
} 

에서 windows_platform.hlinux_platform.h 네이티브 형식에 system_related_type을 typedef로 지정하고 #define platform_SystemCall을 기본 호출로 사용하거나 작은 래퍼 함수 한 플랫폼에서 다른 플랫폼으로 설정된 인수가 너무 다른 경우

특정 작업에 대한 시스템 API가 플랫폼간에 크게 다른 경우 차이를 나누는 고유 한 버전 API를 만들어야 할 수 있습니다. 그러나 대부분의 경우 Windows와 Linux의 다양한 API간에 상당히 직접적인 매핑이 있습니다.

특정 컴파일러 #define을 사용하여 플랫폼을 선택하는 대신 플랫폼에 따라 고유해야하기 때문에 # 프로젝트 파일이나 makefile에서 BUILD_PLATFORM을 정의합니다.

0

다음은 내가 사용하는 것입니다. 그것은 비주얼 스튜디오 2008에서 작동하고는 MinGW :

는 Win32/Win64를 조건부 컴파일을 처리 잡았다가
#ifdef __GNUC__ 
    #define LINUX 
#else 
    #define WINDOWS 
#endif 

#ifdef WINDOWS 
    #include "stdafx.h" 
#else 
    #include <stdlib.h> 
    #include <string.h> 
    #include <stdio.h> 
    #include <ctype.h> 
    #include <assert.h> 
    #include <malloc.h> 
#endif