web-dev-qa-db-ja.com

Cでの64ビットコンパイルの検出

cマクロ、または私のcプログラムがCでのコンパイル時に64ビットまたは32ビットとしてコンパイルされたかどうかを確認できる何らかの方法はありますか?

コンパイラ:チェックが必要なGCCオペレーティングシステム:Unix/Linux

また、OSが64ビットに対応しているかどうかをプログラムの実行時に確認するにはどうすればよいですか?

34
Daniel

この「gcc」にタグを付けたので、試してください

#if __x86_64__
/* 64-bit */
#endif
35
Anomie

以下は、x86やその他のものを想定していない、正しく移植可能なテストです。

#include <stdint.h>
#if UINTPTR_MAX == 0xffffffff
/* 32-bit */
#Elif UINTPTR_MAX == 0xffffffffffffffff
/* 64-bit */
#else
/* wtf */
#endif

言語弁護士をしつこくする簡単なもの。

if(sizeof (void *) * CHARBIT == 64) {
...
}
else {
...
}

これは定数式であるため、最適化コンパイラはテストをドロップし、実行可能ファイルに適切なコードのみを配置します。

11

コンパイラ固有のマクロを使用します。

対象とするアーキテクチャはわかりませんが、指定しないので、ありふれたIntelマシンを想定しているので、おそらく Intel x86 のテストに興味があります。 =および AMD64

例えば:

#if defined(__i386__)
// IA-32
#Elif defined(__x86_64__)
// AMD64
#else
# error Unsupported architecture
#endif

ただし、私はこれらを別のヘッダーに入れて、独自のコンパイラ中立マクロを定義することを好みます。

5
Alex B

GLIBC自体がこれを使用します(inttypes.h):

#if __WORDSIZE == 64
2

このUINTPTR_MAX値を使用して、ビルドタイプを確認します。

#include <stdio.h>
#include <limits.h>

#if UINTPTR_MAX == 0xffffffffffffffffULL               
# define BUILD_64   1
#endif

int main(void) {

    #ifdef BUILD_64
    printf("Your Build is 64-bit\n");

    #else
    printf("Your Build is 32-bit\n");

    #endif
    return 0;
}
0
HaSeeB MiR

同じプログラムソースを64ビットコンピューター、32ビットコンピューター、36ビットコンピューターなどでコンパイルできます(できるはずです)。

したがって、ソースを見るだけでは、それが良いものである場合、どのようにコンパイルされるかはわかりません。ソースがあまり良くない場合、プログラマがそれをコンパイルするために使用されると想定したものを推測できる可能性があります。

あなたへの私の答えは:

ソースファイルに必要なビット数をチェックする方法があります不正なプログラムの場合のみ

コンパイルするビット数に関係なく、プログラムが機能するように努力する必要があります。

0
pmg