2011-07-17 1 views
0

저는 visual studio pro 2010에서 64 비트 C++ 프로젝트를 컴파일하고 있으며 포인터의 크기를 테스트하고 있습니다. void *, char * 등 sizeof (모든 포인터)가 4 바이트임을 보여줍니다. 이것은 64 비트 시스템에서는 잘못되었습니다. 그러나 sizeof (UINT_PTR)는 8이며 이는 64 비트에 맞습니다.sizeof (void *)는 64 목표에서 4입니다.

내 전 처리기 정의는 다음과 같습니다. _WIN64; _AMD64; _WINDOWS; _DEBUG; _USRDLL;
대상 컴퓨터가 MachineX64 (/ MACHINE : X64)입니다.

사물의 sizeof()가 정의 된 곳이 있습니까? 그렇지 않으면, 왜 그것이 나에게 잘못된 크기를주고 있는지 알아낼 수 있습니까?

감사합니다.

편집 : 컴파일러 명령 행 :

/Zi /nologo /W4 /WX- /Od /D "_WIN64" /D "_AMD64" /D "_WINDOWS" /D "_DEBUG" /D "_USRDLL" /D "_WINDLL" /D "_MBCS" /D "_AFXDLL" /Gm /EHsc /RTC1 /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fp"x64\Debug\S2TalkerDLL.pch" /Fa"x64\Debug\" /Fo"x64\Debug\" /Fd"x64\Debug\vc100.pdb" /Gd /errorReport:queue 

링커 명령 행 : 분에

/OUT:"C:\Users\xxx\Documents\Visual Studio 2010\Projects\S2TalkerDLL\x64\Debug\S2TalkerDLL.dll" /INCREMENTAL /NOLOGO /DLL "WINMM.lib" /DEF:".\S2TalkerDLL.def" /MANIFEST /ManifestFile:"x64\Debug\S2TalkerDLL.dll.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\Users\xxx\Documents\Visual Studio 2010\Projects\S2TalkerDLL\x64\Debug\S2TalkerDLL.pdb" /SUBSYSTEM:WINDOWS /PGD:"C:\Users\xxx\Documents\Visual Studio 2010\Projects\S2TalkerDLL\x64\Debug\S2TalkerDLL.pgd" /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X64 /ERRORREPORT:QUEUE 

enter image description here

enter image description here

+1

실수가 있어야합니다. 64 비트 VC++ 프로젝트에서 테스트했을 때'sizeof (void *) == sizeof (UINT_PTR) == 8'이되었습니다. 사용중인 모든 컴파일러 및 링커 스위치를 나열 할 수 있습니까? –

+0

명령 줄 값이있는 편집 된 게시물입니다. – Matt

답변

3

홀드, 당신은 sizeof() 값을 받고 Intellisense 또는 컴파일러에서 가져 왔습니까? 즉,이 같은 것을 컴파일하고 실행 시도가 :

#include <cstdio> 
int main() 
{ 
    ::printf("%d\n", sizeof(void*)); 
    return 0; 
} 

당신이 당신이 sizeof()가 평가 결정하는 인텔리을 사용하고 있는지에 게시 된 스크린 샷에서 나타나기 때문에 내가 부탁드립니다.

Intellisense는 컴파일러와 완전히 다른 것입니다. 자동 완성 목적으로 (아마도 불완전한) 코드를 구문 분석하려고 시도하는 도구 일뿐입니다. 그것은 아마도 /MACHINE:X64과 같은 특정 컴파일러/링커 설정을 알고있을 수도 있고 그렇지 않을 수도 있습니다. 따라서 sizeof(void*)은 잘못된 값을 줄 수 있습니다. 한편

UINT_PTR이 경우 인텔리가 올바른 크기를 수득 할 수 unsigned long 또는 unsigned __int64#ifdef 매크로 및 정수형 통해 정의된다.

컴파일러와 링커는 실제로 코드를 생성하는 프로그램이므로 sizeof()이 실제로 평가하는 내용을 최종적으로 말합니다. 위의 코드 조각을 컴파일하고 실행하고 실제 출력을 확인해야합니다. 64 비트 미만은 8이고 32 비트는 4입니다. Intellisense는 편의 도구 일 뿐이며 최종 실행 파일 출력에 아무런 영향을 미치지 않습니다.


위의 코드를 테스트 할 수있는 64 비트 컴퓨터에 즉시 액세스 할 수없는 경우, 대신이 컴파일을 시도 할 수 있습니다 : 템플릿 마법 (즉, 템플릿 특수화)에

template<unsigned long Size> struct TestSize; // #1 
template<> struct TestSize<8> {}; // #2 

int main() 
{ 
    // If sizeof(void*) == 8, then #2 will be used. 
    // Otherwise, #1 will be used. Since #1 hasn't 
    // been completely defined, this line will fail 
    // to compile if sizeof(void*) != 8. 
    TestSize<sizeof(void*)>(); 
} 

감사합니다 위의 스 니펫은 sizeof(void*)이 8 일 때만 컴파일해야합니다. 결과 실행 파일을 실행할 필요가 없습니다. 그것이 컴파일된다는 사실은 sizeof(void*) == 8을 의미합니다.

+0

예, 저는 Intellisense에 의존하고 있었고 아마도 잘못 이해하고있는 것 같습니다. 내 컴퓨터는 32 비트이므로 권장대로 64 비트 파일을 테스트 할 수 없습니다. 나는 내일 64 비트 머신에서 그것을 시도 할 것이고 나는 어떤 일이 일어나게 될 것이다. – Matt

+0

@Matt : 실제로 64 비트 컴퓨터에서 실행 파일을 실행하지 않고도 알 수있는 방법이 있습니다. 내 편집을 참조하십시오. –

+0

맞습니다. 위의 코드는 x64를 타겟팅 할 때 컴파일되지만 x86을 타겟팅 할 때는 컴파일되지 않습니다. 사실, 코드가 x64 용으로 컴파일되었지만 인텔리 센스가 그것에 대해 불평했습니다. 그래서 나는 인텔리 센스에 의존 할 때 이것을 염두에 두어야한다고 생각합니다. 감사. – Matt