프리프로세서 디렉티브를 사용하여 OS를 확인하려면 어떻게 해야 합니까?
컴파일된 운영체제에 따라 다른 작업을 수행하려면 코드가 필요합니다.이런 걸 찾고 있어요
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
방법이 있을까요?같은 일을 할 수 있는 더 좋은 방법이 있을까요?
OS용 사전 정의된 매크로 사이트에는 완전한 체크 리스트가 있습니다.그 중 몇 가지는 다음과 같습니다.또, 입수처 링크도 포함되어 있습니다.
창문들
_WIN32
와 64비트 모두 ''
_WIN64
64비트
__CYGWIN__
Unix (Linux, *BSD, Mac OS X 제외)
이 체크의 사용상의 몇개의 함정에 대해서는, 이 관련 질문을 참조해 주세요.
unix
__unix
__unix__
Mac OS X
__APPLE__
에도
__MACH__
둘 다 정의되어 있기 때문에 둘 중 하나를 체크할 수 있습니다.
리눅스
__linux__
linux
(POSIX)
__linux
(POSIX)
FreeBSD
__FreeBSD__
안드로이드
__ANDROID__
#include <stdio.h>
/**
* Determination a platform of an operation system
* Fully supported supported only GNU GCC/G++, partially on Clang/LLVM
*/
#if defined(_WIN32)
#define PLATFORM_NAME "windows" // Windows
#elif defined(_WIN64)
#define PLATFORM_NAME "windows" // Windows
#elif defined(__CYGWIN__) && !defined(_WIN32)
#define PLATFORM_NAME "windows" // Windows (Cygwin POSIX under Microsoft Window)
#elif defined(__ANDROID__)
#define PLATFORM_NAME "android" // Android (implies Linux, so it must come first)
#elif defined(__linux__)
#define PLATFORM_NAME "linux" // Debian, Ubuntu, Gentoo, Fedora, openSUSE, RedHat, Centos and other
#elif defined(__unix__) || !defined(__APPLE__) && defined(__MACH__)
#include <sys/param.h>
#if defined(BSD)
#define PLATFORM_NAME "bsd" // FreeBSD, NetBSD, OpenBSD, DragonFly BSD
#endif
#elif defined(__hpux)
#define PLATFORM_NAME "hp-ux" // HP-UX
#elif defined(_AIX)
#define PLATFORM_NAME "aix" // IBM AIX
#elif defined(__APPLE__) && defined(__MACH__) // Apple OSX and iOS (Darwin)
#include <TargetConditionals.h>
#if TARGET_IPHONE_SIMULATOR == 1
#define PLATFORM_NAME "ios" // Apple iOS
#elif TARGET_OS_IPHONE == 1
#define PLATFORM_NAME "ios" // Apple iOS
#elif TARGET_OS_MAC == 1
#define PLATFORM_NAME "osx" // Apple OSX
#endif
#elif defined(__sun) && defined(__SVR4)
#define PLATFORM_NAME "solaris" // Oracle Solaris, Open Indiana
#else
#define PLATFORM_NAME NULL
#endif
// Return a name of platform, if determined, otherwise - an empty string
const char *get_platform_name() {
return (PLATFORM_NAME == NULL) ? "" : PLATFORM_NAME;
}
int main(int argc, char *argv[]) {
puts(get_platform_name());
return 0;
}
GCC를 사용하여 테스트한 결과, 쨍그랑 소리가 났다.
- 데비안 8
- Windows (최소 GW)
- Windows(Cygwin)
Windows 에서의 show GCC 정의:
gcc -dM -E - <NUL:
Linux의 경우:
gcc -dM -E - </dev/null
MinGW에서 미리 정의된 매크로:
WIN32 _WIN32 __WIN32 __WIN32__ __MINGW32__ WINNT __WINNT __WINNT__ _X86_ i386 __i386
UNIX의 경우:
unix __unix__ __unix
_WIN32
정의 검사가 작동하지 않습니다.츠키다
#if defined(_WIN32) || defined(__CYGWIN__)
// Windows (x86 or x64)
// ...
#elif defined(__linux__)
// Linux
// ...
#elif defined(__APPLE__) && defined(__MACH__)
// Mac OS
// ...
#elif defined(unix) || defined(__unix__) || defined(__unix)
// Unix like OS
// ...
#else
#error Unknown environment!
#endif
상세한 것에 대하여는, https://sourceforge.net/p/predef/wiki/OperatingSystems/ 를 참조해 주세요.
OS를 포함한 타겟플랫폼의 다양한 사전 정의된 매크로를 사용할 수 있습니다.BOOST_OS_*
) Yes Boost는 C++ 라이브러리로 생각되지만, 이것은 C와 함께 동작하는 프리프로세서 헤더입니다.
이 라이브러리는 C, C++, Objective C 및 Objective C++ 사전 정의된 매크로 또는 일반적으로 사용 가능한 헤더에 정의된 정보로 컴파일러, 아키텍처, 운영 체제, 라이브러리 및 기타 버전 번호를 정의합니다.이 라이브러리의 아이디어는 Boost Config 라이브러리를 확장하여 지원하는 기능 정의보다 더 많은 일관된 정보를 제공하자는 제안에서 비롯되었습니다.다음은 그 간단한 제안서의 편집본입니다.
예를들면
#include <boost/predef.h>
#if defined(BOOST_OS_WINDOWS)
#elif defined(BOOST_OS_ANDROID)
#elif defined(BOOST_OS_LINUX)
#elif defined(BOOST_OS_BSD)
#elif defined(BOOST_OS_AIX)
#elif defined(BOOST_OS_HAIKU)
...
#endif
전체 목록은 운영 체제 매크로에서 찾을 수 있습니다.
자세한 내용은 플랫폼 ID를 부스트에서 가져오는 방법을 참조하십시오.
Microsoft C/C++ 컴파일러(MSVC)의 사전 정의된 매크로는 여기에 있습니다.
다음을 찾고 계신 것 같습니다.
_WIN32
- ARM, ARM, 「 32비트 ARM, 64비트 ARM, x86 「x64」, 1비트 ARM. 않으면 undefined(되지 않음)_WIN64
또는됩니다.- 64비트 ARM x64로 정의됩니다.그렇지 않으면 정의되지 않습니다.
gcc 컴파일러 사전 정의 MAcros는 여기에서 찾을 수 있습니다.
다음을 찾고 계신 것 같습니다.
__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__
미리 정의된 해당 컴파일러를 구글로 검색하십시오.
외부로부터의 언급은 죄송합니다만, 당신의 질문에 적합하다고 생각합니다.
C/C++ 팁:컴파일러의 사전 정의된 매크로를 사용하여 운영체제 유형을 검출하는 방법
#ifdef _WIN32
// do something for windows like include <windows.h>
#elif defined __unix__
// do something for unix like include <unistd.h>
#elif defined __APPLE__
// do something for mac
#endif
C 표준에 따라 설정된 표준 매크로가 없습니다.일부 C 컴파일러는 일부 플랫폼에 대해 설정합니다(예를 들어 Apple의 패치 적용 GCC는 Apple 시스템과 Darwin 플랫폼에서 컴파일 중임을 나타내기 위해 매크로를 설정합니다.플랫폼이나 C 컴파일러에 의해서도 설정이 되는 경우가 있습니다만, 일반적인 방법은 없습니다.
빌드 가장 .hayalci는 이 를 빌드 프로세스로 설정하는 것이 좋습니다.코드를 변경하지 않고 대부분의 컴파일러에서 매크로를 쉽게 정의할 수 있습니다.하면 돼요.-D MACRO
GCC, ,,
gcc -D Windows
gcc -D UNIX
그리고 당신의 코드:
#if defined(Windows)
// do some cool Windows stuff
#elif defined(UNIX)
// do some cool Unix stuff
#else
# error Unsupported operating system
#endif
하이쿠의 정의는 여기서 찾을 수 없었습니다.한마디로 하이쿠오스의 정의는 간단합니다.__HAIKU__
요약하자면, 여기 도움이 되는 링크가 많이 있습니다.
- GCC 공통 사전 정의 매크로
- SourceForge 사전 정의된 운영 체제
- MSDN 사전 정의된 매크로
- 링크된 Naudea 소프트웨어 페이지
- 위키피디아!!!
- Source Forge의 "표준, 컴파일러, 운영체제 및 하드웨어 아키텍처용 사전 정의된 컴파일러 매크로 개요"
- FreeBSD의 '운영체제 차별화'
- 모든 종류의 사전 정의된 매크로
libportable
일부 컴파일러는 이를 지원하는 #defines를 생성합니다.컴파일러의 메뉴얼을 읽고, 그 내용을 확인합니다.MSVC가 정의하는 것은__WIN32__
, GCC에는 다음과 같은 기능이 있습니다.touch foo.h; gcc -dM foo.h
대부분의 경우 특정 기능이 있는지 여부를 확인하는 것이 좋습니다.를 들어, 함수가 ": "인 경우pipe()
존재여부여
#define OSsymbol
★★★★★★★★★★★★★★★★★」#ifdef OSsymbol
심볼입니다.#define
【OS】【OS】【OS】【OS】【OS】【OS】
일반적으로 선택한 OS 기호를 정의하는 중앙 헤더 파일을 포함하고 OS 고유의 include 및 라이브러리 디렉토리를 사용하여 컴파일 및 빌드합니다.
개발 환경을 지정하지 않았지만 컴파일러가 공통 플랫폼과 OS에 대한 글로벌 정의를 제공하는 것은 확실합니다.
http://en.wikibooks.org/wiki/C_Programming/Preprocessor 도 참조해 주세요.
프리프로세서 디렉티브를 경고 또는 오류로 사용하여 컴파일 시 이 프로그램을 실행할 필요가 전혀 없는지 확인할 수 있습니다.단순히 컴파일만 하면 됩니다.
#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__)
#error Windows_OS
#elif defined(__linux__)
#error Linux_OS
#elif defined(__APPLE__) && defined(__MACH__)
#error Mach_OS
#elif defined(unix) || defined(__unix__) || defined(__unix)
#error Unix_OS
#else
#error Unknown_OS
#endif
#include <stdio.h>
int main(void)
{
return 0;
}
사용하고 있는 operating system을 입수하기 위해서 작은 라이브러리를 작성했습니다만, clib(The C package manager)를 사용해 인스톨 할 수 있기 때문에, 프로젝트의 의존관계로서 사용하는 것은 매우 간단합니다.
설치하다
$ clib install abranhe/os.c
사용.
#include <stdio.h>
#include "os.h"
int main()
{
printf("%s\n", operating_system());
// macOS
return 0;
}
문자열을 반환합니다(char*
사용하고 있는 operating system의 이름으로, 이 프로젝트의 상세한 것에 대하여는, Github 의 메뉴얼을 참조해 주세요.
언급URL : https://stackoverflow.com/questions/142508/how-do-i-check-os-with-a-preprocessor-directive
'programing' 카테고리의 다른 글
ConcurrentHashMap 값을 반복하여 스레드 세이프입니까? (0) | 2022.08.28 |
---|---|
주석을 사용하여 구성된 스프링 빈에 속성 값을 삽입하려면 어떻게 해야 합니까? (0) | 2022.08.28 |
'static' 키워드는 클래스에서 무엇을 합니까? (0) | 2022.08.28 |
Vuex Store에서 여러 URL(axios)을 설정하는 가장 좋은 방법은 무엇입니까? (0) | 2022.08.28 |
Vue Js: 범위 지정 슬롯 및 IE11 문제 (0) | 2022.08.28 |