sourcecode

내 코드가 Windows로 컴파일되고 있는지 확인할 수 있는 매크로가 있습니까?

codebag 2023. 7. 27. 21:56
반응형

내 코드가 Windows로 컴파일되고 있는지 확인할 수 있는 매크로가 있습니까?

컴파일 중인 OS가 Windows인지 확인하고 싶습니다.확인할 수 있는 간단한 매크로가 있습니까?

[편집: 컴파일 타임 매크로를 사용하여 현재 사용 중인 환경을 확인하고 싶다고 생각합니다.Windows(윈도우) 대신 Linux(리눅스) 아래의 Wine에서 실행 중인지 확인하고 싶을 수도 있지만 일반적으로 컴파일러는 특정 환경을 대상으로 하며 Windows(DOS) 또는 그렇지 않지만 둘 다 실행되는 경우는 거의 없습니다.]

일부 컴파일러는 Windows 빌드 환경을 나타내는 매크로를 제공합니다.그러나 이는 컴파일러마다 다르며, 대상 환경이 독점적으로 윈도우가 아니라면 윈도우의 동일한 컴파일러에서도 마찬가지입니다.보통은.__WIN32__하지만 항상은 아닙니다.

#if defined (__WIN32__)
  // Windows stuff
#endif

때로는 그럴 수도 있습니다._WIN32,__CYGWIN32__또는 컴파일러 표시기(_MSC_VER).

(으로 (makefile 해통을) 을▁in▁the▁if▁(▁usuallyment▁pass다▁you있▁in니습make▁can)▁environ수▁the▁you▁(▁you▁the▁thenfile를 전달할 수 있습니다.#define" 령행에와, " 은같서명"와 g++ -D __WIN32__ yourfile.c".

여기에 조금 더 많은 정보

컴파일, 호스트 및 런타임 환경을 탐지하는 데는 여러 가지 방법이 있습니다.모두 당신이 정확히 알고 싶은 것에 달려 있습니다.환경에는 세 가지 유형이 있습니다.

  • 빌드: 프로그램이 컴파일되는 환경입니다.
  • 호스트: 프로그램이 실행되는 환경입니다.
  • 대상: 코드 생성 도구(컴파일러 등)의 경우 생성된 코드가 실행되는 곳입니다.

교차 컴파일하는 경우 빌드 및 호스트 환경이 완전히 다를 수 있으며(내장 애플리케이션을 빌드할 때는 일반적이지만 데스크톱/서버 애플리케이션을 빌드할 때는 일반적이지 않음) 컴파일된 이진 파일을 컴파일하는 데 사용되는 시스템에서 실행할 수 없습니다.그렇지 않으면 호스트 환경이 빌드 환경과 호환되어야 합니다. 예를 들어 Vista에서 실행될 XP에서 애플리케이션을 빌드해야 합니다.

C 프리프로세서 매크로는 호스트 시스템의 세부 정보(예: 실행 중인 대상)를 알려주는 데 사용할 수 없습니다. 코드가 컴파일된 용도만 알려줄 수 있습니다.윈도우즈의 경우 가장 중요한 두 개의 매크로가 있습니다.

  • _WIN32는 Win32 API를 사용할 수 있음을 나타냅니다.당신이 어떤 컴파일러를 사용하고 있는지는 알려주지 않지만, 실제로 _WIN32는 Cygwin의 GCC와 MinGW의 GCC를 사용할 때 모두 정의됩니다.따라서 _WIN32를 사용하여 Visual Studio에서 컴파일 중인지 확인하지 마십시오.
  • _MSC_VER 프로그램이 Microsoft Visual C/C++로 컴파일되고 있음을 알려줍니다.뭐, 거의._MSC_VER또한 Visual C++를 대체할 Intel의 C++ 컴파일러를 사용할 때 정의됩니다.

Visual Studio 설명서에 설명된 다른 매크로가 많이 있습니다.

사용 중인 Windows(윈도우)의 정확한 버전을 알고 싶다면 다른 답변에 설명된 대로 GetVersion()과 같은 런타임 기능을 사용해야 합니다.

확인할 내용을 정확히 알려주시면 더 구체적인 답변을 받으실 수 있습니다.

% touch foo.C ; g++ -dM -E foo.C

[machine specific] g++ 컴파일러에 의해 자동으로 정의된 모든 매크로(#define's)를 나열하는 작업을 잘 수행할 수 있습니다.

마이크로소프트 컴파일러에도 비슷한 것이 있을 수 있습니다.

이 세 줄은 탐지하는 데 도움이 될 것입니다. 먼저 사전 정의된 윈도우 힌트를 하나의 OS로 통합합니다.WIN 매크로 정의:

#정의된 경우(_)WIN32) || 정의됨(WIN32) || 정의됨(__CYGWIN__) || 정의됨(__MINGW32__) || 정의됨(__BORLANDC__)#OS 정의_#엔디프

그런 다음 ifdef: 사전 처리기를 사용하여 확인할 수 있습니다.

#ifde OS_WIN//Windows 관련 항목#오페라의//일반적인 내용#엔디프

++가 아님)windows.h) 정의합니다._WIN32모든 빌드에 대해 확인하는 것이 더 안전한 매크로입니다.MinGW gcc 컴파일러도 마찬가지입니다.Win32를 대상으로 하는 모든 교차 컴파일 환경에서도 이를 설정해야 합니다.

MS Windows 대상 코드를 실행 중인 경우 GetVersion() 또는 GetVersionEx()로 전화하여 자세한 정보를 확인하고 실행 중인 Windows 버전을 식별할 수 있습니다.

자세한 내용은 MSDN 정보를 참조하십시오.

http://msdn.microsoft.com/en-us/library/ms724451(VS.85).aspx

이것은 비주얼 스튜디오 2012와 다른 cgwin의 g++ 컴파일러에서 작동합니다.잘라내어 붙여넣지만 일반적으로 두께가 얇습니다. Windows 운영 체제를 감지하는 것이 전부입니다.정량화만 적용하면 됩니다.이기지 못하면 *inux :D 즐겨라.

#include <string>
#include <iostream>
#include <fstream>
#include <cstdlib>
Using namespace std;


int main(){    
    char chCap;    int i = 0;
    const int MAX_BUFFER = 70; 
    char buffer[MAX_BUFFER];

    string cmd="ver";   
    FILE *stream = _popen(cmd.c_str(), "r");

    if (0 != stream){
        while (!feof(stream)){  
            //One way is here
            //chCap = fgetc(stream);
            //cout << chCap;
            //buffer[i++] = chCap;

            //This one seams better
            fgets(buffer, MAX_BUFFER, stream);      
        }
        _pclose(stream);
    }       
    cout << endl;
    cout << buffer << endl;

    //The op sys detection starts here
    string opSys(buffer);   //char array to string
    if("Microsoft" == opSys.substr(0,9)){
        cout << "You are in a Microsoft envornment " << endl;
    }
    system("pause");
    return 0;    
}

지금까지 언급된 링크는 컴파일 시의 정보를 나타냅니다.컴파일 시 이러한 코드 세그먼트 내에서 플래그를 설정할 수 있습니다.

하지만, 저는 당신이 질문하는 것이 "어떤 버전의 창에서 실행되고 있습니까?"와 같은 맥락이라고 생각합니다."창 아래에서 실행할 수 있도록 컴파일되었습니까?"가 아닙니다.저는 그것이 정확한 가정이길 바랍니다.

C#에서는 비교적 간단합니다.시스템을 참조할 수 있습니다.환경.그런 다음 OS 버전에서 "플랫폼"을 찾습니다.

하지만 당신은 C++에 대해 묻고 있습니다.어떤 컴파일러를 사용하고 있습니까?이것은 운영 체제 버전을 확인하는 방법에 큰 차이를 만듭니다. 이 정보를 얻기 위한 단일 표준이 없기 때문입니다.

Visual C++에서 Google을 사용하여 GetVersion/GetVersionEx에 대한 정보를 찾습니다.둘 다 프로그램이 실행 중인 현재 Windows 버전에 대한 정보가 포함된 구조를 제공합니다.

사실 저는 환경과 함께 갈 것입니다.getenv()는 표준 라이브러리 함수이므로 이를 수행할 수 있는 유일한 휴대용 방법일 것입니다.비결은 모든 OS에 고유한 변수를 파악하는 것입니다.Windows에는 설정해야 하는 ComSpec, appdata, Windir, 시스템 루트 및 시스템 드라이브가 있습니다.WINDOWS 또는 WINNT에 대한 경로 변수를 문자열화할 수도 있지만 정확하지 않을 수 있습니다.저는 Linux Shell/Solaris/MacOS 전문가가 아니므로 다른 사람이 해당 OS에 어떤 "표준" 환경 변수가 있는지 알려줄 수 있습니다.CygWin도 문제를 일으킬 수 있습니다.

언급URL : https://stackoverflow.com/questions/430424/are-there-any-macros-to-determine-if-my-code-is-being-compiled-to-windows

반응형