Est-il un GCC directive de préprocesseur pour vérifier si le code est compilé sur un ordinateur 64 bits?
Je suis en train de faire quelque chose comme ce qui suit;
#ifdef 64-bit
#define DECIMAL_FORMAT %ld
#else
#define DECIMAL_FORMAT %d
#endif
.
intptr_t d;
.
printf(“Some message with DECIMAL_FORMAT in the middle of it\n”, d);
La variable " d "etre de type "intptr_t" besoins "%d' spécificateur de format de 32 bits machines et spécificateur de format '%ld' sur 64 bits machines. Je suis à la recherche d'une solution pour pouvoir compiler le code sur 32 bits machines et 64 bits des machines sans apporter de modifications à la GCC en ligne de commande ou dans le code source.
OriginalL'auteur Vilmorin | 2009-03-25
Vous devez vous connecter pour publier un commentaire.
Je pense __LP64__ peut-être ce que vous cherchez. Voir http://gcc.gnu.org/onlinedocs/gcc-4.1.2/cpp/Common-Predefined-Macros.html
Peut-être une meilleure façon d'aller, cependant, est d'utiliser le %p spécificateur de printf() au lieu de %ld ou %d. Ensuite, vous n'avez même pas à vous inquiéter à ce que le pointeur de la souris de taille.
OriginalL'auteur Fred Larson
Vous souhaitez utiliser le
PRI*
des macros définies dansinttypes.h
. Vous permettre en définissant__STDC\_FORMAT\_MACROS
. Vous pouvez ensuite utiliserLa
PRIxPTR
macro s'étendre àllx
si__WORDSIZE == 64
, etlx
oux
autrement.Eh bien, la PRI*-les macros sont c99, donc si vous pouvez démontrer qu'ils sont mauvais comportement sur votre machine, vous devriez probablement signaler un bug pour les gens de debian.
Ma conjecture est la suivante: "l" "x" est "lx", ce qui est bien si les pointeurs et
long
sont à la fois 64 bits ou 32 bits; "llx est vraiment nécessaire pour imprimer un pointeur seulement sisizeof(void*) == sizeof(long long)
maissizeof(long long) > sizeof(long)
OriginalL'auteur JesperE
Une solution recommandée est de rendre votre application se comporte de façon plus prévisible. Si vous le rendre dépendant de la taille d'un pointeur de mémoire, vous pouvez avoir quelques surprises indésirables. Printf comprend uniquement un petit nombre de types, si vous devez imprimer une valeur d'un type que vous ne pouvez pas toujours vous assurer qu'il est vraiment connue, il est beaucoup mieux pour le convertir en quelque chose de connu.
C'est un bon conseil, et valable pour n'importe quel type. Par exemple, pour imprimer un Unix PID (qui est de type pid_t):
Vous n'avez pas à savoir quel est le type et la taille de pid, aussi longtemps que le type de cible est assez grand.
OriginalL'auteur Juliano