본문 바로가기

차장님의 이야기

C++에서 OS 종류, 컴파일러 종류, 아키텍처 종류 알아 내는법.

만약 이 글을 읽고 있는 사람이 CMAKE를 알고 있다면 큰 문제가 발생하지는 않는다.

CMAKE에서 OS, 컴파일러종류, 아키텍처 종류를 전부 다 손쉽게 알 수 있고, 전처리문을 만들어 주기도 한다.

 

먼저 제일 궁금한 부분은 OS의 종류를 파악하는것. 이라고 생각을 한다.

 

 

제일 먼저 코드로 보여 주자면

애플의 컴퓨터에 설치가 되어 있는 C++ 컴파일러

GNUC 같은 경우에는 전처리 문으로 "__APPLE__" 이 선언이 되어 있다.

 

추가적으로 판별 문은 총 3가지 이며.

 

MAC, Windows, Linux 인지 체크를 하고 그 외에 모든것이 아닐경우 OTHERS로 판별하고, 컴파일을 중지한다. 

 

#define문, #if문 은 전처리문 이다.

 

 

 

 

MAC에선 __APPLE__ 이 정의가 되어 있고.

Windows에선 _WIN64,  _WIN32 가 정의가 되어 있다.

다른 계열은 테스트 해보진 못했지만 Ubuntu 계열은 __linux__ 가 실제로 존재 한다.

 

+ 추가적으로 WSL - Ubuntu (Windows Subsystem for Linux)에서 사용할 경우 __linux__ 로 잡혔다.

 

이후로는 컴파일러 종류 확인이다.

 

컴파일러 확인하는 구간은 마찬가지로 윈도우와 똑같이

 

전처리로 판단한다.

 

MSVC 에선 _MSC_VER

GNUC(gcc, g++) 에선 __GNUC__

윈도우의 gcc (MINGW)는 __MINGW32__ 또는 __MINGW64__ 이다.

 

그 외의 컴파일러는 llvm 같은 경우는 잘 모르겠지만 llvm 또한 GNUC 계열이라서 아마.. 될것이다. 확인 해보고 내용을 추가 할 예정이다.

 

왠만한 컴파일러는 GNUC 이므로 크게 문제는 없다.

 

 

마지막으로 아키텍처,

해당 프로그램이 몇 비트 프로그램인지 판별 하기 위한 로직이다.

 

아까 컴파일러의 전처리문을 보게 된다면 _WIN32, _WIN64의 컴파일러 전처리문을 보았을 것이다.

 

맞다. 그것은 비트 관련된 정보이다.

 

하나의 문제점? 하나의 실수 할 부분을 미리 알려 주자면

OS_WINDOWS에서 Win32로 선택 시 _WIN32 가 존재하고

WIN64로 할 경우 _WIN64 만 있는것이 아니라

_WIN32 도 선언이 되어 있다.

 

그래서 적용할 때 WIN64 부터 조건을 확인 해야 한다.

 

그 외에 컴파일러 기준으로 GNUC 로 확인을 하게 하였다.

 

위의 전처리문을 확인 하고 글쓴이의 컴퓨터 OS와, 컴파일러, 아키텍처를 알 수 있다.

MACOS에 GNUC를 사용하고 X64 컴퓨터이다.

이 것을 만약 윈도우에서 한다면

WINDOWS에 MSVC(MINGW)를 사용하고 xBit 컴퓨터 로 나올 것이다.

 

해당 코드 기반으로 크로스 플랫폼 프로그램을 작성 할 수 있다.

 

대표적인 예로.

void delay(int ms) {
#if OS_WINDOWS
  Sleep(ms);
#elif OS_LINUX || OS_MAC
 // 코드 간략화를 위해 생략.
  system("sleep " + ms / 1000.0f);
#endif
}

 

이 처럼 전처리 문으로 하나의 함수, 여러개의 플랫폼을 지원 할 수 있도록 개발도 가능하다.