2011-07-17 8 views
0

私はVisual Studio 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またはコンパイラからの?それはあなたがsizeof()があると評価かを決定するためにインテリセンスを使用していることを掲載スクリーンショットから表示されますので、私は聞いて

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

:それはあなたがこのような何かをコンパイルし、実行しようとした持ち、です。

Intellisenseは、コンパイラとは完全に別のものです。これは、オートコンプリートの目的であなたのコード(不完全な可能性が高い)を解析しようとするツールです。それは/MACHINE:X64のような特定のコンパイラ/リンカー設定を認識しているかどうかわからないので、sizeof(void*)が間違った値を与えるかもしれません。

一方、UINT_PTR#ifdefマクロこの場合、インテリセンスが正しいサイズを与えることができるようになりunsigned long又はunsigned __int64ような整数型、によって定義されます。

コンパイラとリンカは、コードを実際に生成するプログラムであるため、最終的には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用にコンパイルされたコードであっても、intellisenseはそれについて不平を言った。だから、私はインテリセンスに頼っているときにそれを覚えておくべきだと思います。ありがとう。 – Matt

関連する問題