Preprocessor 사용
OS 를 구분할 수 있는 define 값이 미리 정의되어 C 컴파일러로 확인할 수 있다.
각 OS 마다 C 컴파일러에 제공하는 predefiend 값은 구글 검색 등을 통해 확인 할 수 있다.
팁) 또는 gcc 는 predefined macro 를 확인하는 기능을 제공한다
https://gcc.gnu.org/onlinedocs/cpp/System-specific-Predefined-Macros.html
e.g.) WSL 환경 (참고: 입력 종료 필요함 Ctrl+d)
$ gcc -dM -E - | grep linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1
$ gcc -dM -E - | grep unix
#define __unix__ 1
#define __unix 1
#define unix 1
$ cpp -dM | grep linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1
$ cpp -dM | grep unix
#define __unix__ 1
#define __unix 1
#define unix 1
팁) 그리고, Windows 는 predefined 값 정보를 제공하는 웹 페이지를 제공한다.
https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=msvc-170
e.g.)
종합해 보면 아래와 같이 cross platform 대응 코드를 작성할 수 있다.
e.g.)
#if defined(__APPLE__) || defined(__MACH__) /* mac os x */
// mac os x code...
#elif defined(unix) || defined(__unix__) || defined(__unix) /* unix or linux */
// linux code...
#elif defined(_WIN32) || defined(_WIN64) /* windows */
// windows code...
#endif
단순 OS 구분 외에도 세부적인 차이점이 predefined 값으로 제공되며 필요시 각 메뉴얼을 찾아보기 바람.
주의할 점은 해당 OS 에 대한 부분만 컴파일되기 때문에 여러 OS 를 옮겨 가며 빌드하고 테스트 해야 하는 어려움이 있다.
비교: Cross Compiler
https://stackoverflow.com/a/1031347/5676460
Cross platform
동일한 기능이 여러 플랫폼에서 빌드 및 동일하게 실행 가능한 프로그램 또는 코드의 기능
Cross compiler
현재 컴파일러 외 다른 플랫폼에서 동작하는 코드를 생성하는 컴파일러. 임베디드 환경의 경우 반드시 cross compiler 를 제공해야 함.
댓글 없음:
댓글 쓰기