web-dev-qa-db-fra.com

Détection de la compilation 64 bits en C

y a-t-il une macro C ou une sorte de moyen que je peux vérifier si mon programme c a été compilé en 64 bits ou 32 bits au moment de la compilation en C?

Compilateur: systèmes d'exploitation GCC dont j'ai besoin pour vérifier: Unix/Linux

Comment puis-je vérifier lors de l'exécution de mon programme si le système d'exploitation est capable de 64 bits?

34
Daniel

Puisque vous avez marqué ce "gcc", essayez

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

Voici le test correct et portable qui ne suppose pas x86 ou autre chose:

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

Un simple qui fera presser l'avocat de la langue.

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

Comme il s'agit d'une expression constante, un compilateur d'optimisation abandonnera le test et ne mettra que le bon code dans l'exécutable.

11

tilisez une macro spécifique au compilateur.

Je ne sais pas quelle architecture vous visez, mais comme vous ne le spécifiez pas, je suppose que les machines Intel sont courantes, donc vous êtes probablement intéressé à tester Intel x86 = et AMD64 .

Par exemple:

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

Cependant, je préfère les mettre dans l'en-tête séparé et définir ma propre macro indépendante du compilateur.

5
Alex B

GLIBC lui-même utilise ceci (dans inttypes.h):

#if __WORDSIZE == 64
2
Jonathon Reinhart

Utilisez cette valeur UINTPTR_MAX pour vérifier le type de construction.

#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

La même source de programme peut (et devrait pouvoir) être compilée sur des ordinateurs 64 bits, des ordinateurs 32 bits, des ordinateurs 36 bits, ...

Donc, juste en regardant la source, si elle est bonne, vous ne pouvez pas dire comment elle sera compilée. Si la source n'est pas aussi bonne, il peut être possible de deviner ce que le programmeur a supposé être utilisé pour la compiler.

Ma réponse est:

Il existe un moyen de vérifier le nombre de bits nécessaires pour un fichier source niquement pour les mauvais programmes.

Vous devez vous efforcer de faire fonctionner vos programmes quel que soit le nombre de bits pour lesquels ils seront compilés.

0
pmg