programing

프리프로세서 디렉티브를 사용하여 OS를 확인하려면 어떻게 해야 합니까?

bestcode 2022. 8. 28. 09:41
반응형

프리프로세서 디렉티브를 사용하여 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 MACROGCC, ,,

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__

요약하자면, 여기 도움이 되는 링크가 많이 있습니다.

일부 컴파일러는 이를 지원하는 #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

반응형