문제

OS가 현재 32 비트 또는 64 비트 모드로 실행 중인지 여부를 찾기 위해 C 프로그램에서 어쨌든 있습니까? 아래와 같이 간단한 프로그램을 사용하고 있습니다

int main(void){
     switch(sizeof(void*)){
        case 4: printf("32\n");
        break;
        case 8: printf("64\n");
        break;
    }
}

이것이 올바른 접근법입니까? 하드웨어가 64 비트이고 OS가 32 비트 인 경우이 코드가 모든 시나리오에서 작동합니까? Diff 구성에서 이것을 테스트 할 기계가 없습니다.

조언 해주셔서 감사합니다.

도움이 되었습니까?

해결책

  • 일반적으로 32 비트 실행 파일은 64 비트 OS 또는 32 비트 1에서 실행 중인지 알 수 없습니다 (일부 OS는 말할 수있는 방법을 가질 수 있습니다. 64 비트 실행 파일은 32 비트 OS에서 실행되지 않습니다 (32 비트 OS가 64 비트 OS를 실행하는 프로세서를 모방 할 가능성을 할인하면 ...)

  • sizeof () 결과는 주로 컴파일 타임 상수이며, 실행중인 OS 버전에 따라 다른 것을 반환하지 않습니다.

실제로 무엇을 알고 싶습니까?

다른 팁

주어진대로 귀하의 질문에 엄격하게 답변하려면 다음과 같습니다.

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
    long wordBits = sysconf(_SC_WORD_BIT);
    if (wordBits == -1 && errno == EINVAL)
        return EXIT_FAILURE;
    else
        printf("%ld\n", wordBits);
    return EXIT_SUCCESS;
}

이것은 GLIBC가 올바르게 구성된 모든 상황에서 작동하며 레지스터 크기를 STDOUT에 인쇄하거나 1의 종료 코드를 반환합니다.

또한보십시오

컴파일 타임 방법 외에도 Windows에서 실행중인 경우 : IsWow64Process ( http://msdn.microsoft.com/en-us/library/ms684139.aspx ) 돌아올 것입니다 true 프로세스가 64 비트 창에서 실행되는 프로세스 인 경우.

Windows에서는 Processor_architecture 환경 변수를 볼 수 있습니다. 프로그램이 32 비트 모드로 실행될 때 (32 비트 OS에서 실행되거나 64 비트 OS에서 실행되지만 WOW64의 32 비트 프로그램으로) 또는 "IA64로 실행되기 때문에"x86 "을 반환합니다. "또는"AMD64 "는 64 비트 OS에서 기본 64 비트 프로그램으로 실행되는 경우.

이 질문에 대답하는 유일한 방법은 다음과 같습니다.

(1) OS가 32 또는 64 비트인지 여부를 알려주는 일부 시스템 별 기능 (API 호출, 환경 변수 등)을 사용하십시오.

또는

(2) 컴파일러 제공 매크로를 사용하여 동일한 것을 알려줍니다 (사용 가능한 경우).

내장 표준 언어 기능으로 어떤 종류의 OS를 가지고 있는지 결정할 방법이 없습니다. 컴파일러에 의해 제공되며 OS와 완전히 독립적입니다.

나는 당신의 솔루션이 아마도 대부분의 경우에 유효하다고 생각합니다. 확실히 모든 표준 IA64 데이터 모델 포인터는 64 비트입니다. 그러나 이것은 이론적으로 모든 아키텍처에서 사실이 아닐 수도 있습니다. 테스트하는 것이 더 안전 할 수 있습니다 sizeof(uintptr_t) 컴파일러에 C99 헤더가있는 경우; 그러나 다시 주소 너비는 레지스터 너비를 나타냅니다. "64 비트"에 따라 주소 범위 또는 정수 범위를 언급하는지 여부에 따라 다릅니다. 동일 할 필요는 없습니다.

32 비트 및 64 비트 컴파일에는 다른 컴파일러 또는 다른 컴파일러 스위치가 필요하기 때문에 대상 아키텍처는 빌드 타임에 알려야하며 런타임에 결정할 필요가 없습니다.

대부분의 컴파일러는 내장 아키텍처 매크로를 제공하여 빌드 시간에 결정할 수 있습니다. 다양한 컴파일러, OS 및 아키텍처에 대한 이러한 매크로의 포괄적 인 목록은 다음과 같습니다. http://predef.sourceforge.net/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top