Существует ли директива препроцессора GCC, чтобы проверить, компилируется ли код на 64-битной машине? - PullRequest
14 голосов
/ 25 марта 2009

Я пытаюсь сделать что-то вроде следующего:

#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);

Переменная 'd', имеющая тип 'intptr_t', требует спецификатора формата '% d' на 32-битных машинах и спецификатора формата "% ld" на 64-битных машинах. Я ищу решение, позволяющее компилировать код как на 32-разрядных, так и на 64-разрядных компьютерах без внесения изменений в командную строку GCC или исходный код.

Ответы [ 3 ]

24 голосов
/ 25 марта 2009

Я думаю, что __LP64__ может быть тем, что вы ищете. Смотри http://gcc.gnu.org/onlinedocs/gcc-4.1.2/cpp/Common-Predefined-Macros.html

Возможно, лучший способ сделать это - использовать% p для printf () вместо% ld или% d. Тогда вам даже не нужно беспокоиться о размере указателя.

8 голосов
/ 26 марта 2009

Вы хотите использовать макросы PRI*, определенные в inttypes.h. Вы включаете их, определяя __STDC\_FORMAT\_MACROS. Затем вы можете использовать

 intptr_t d = ... ;
 printf("This is an intptr_t: %" PRIxPTR "\n", d);

Макрос PRIxPTR расширится до llx, если __WORDSIZE == 64, и lx или x в противном случае.

1 голос
/ 25 марта 2009

Рекомендуемое решение - сделать ваше приложение более предсказуемым. Если вы сделаете это зависимым от размера указателя памяти, у вас могут возникнуть некоторые нежелательные сюрпризы. Printf понимает только несколько типов, если вы должны напечатать значение для типа, который не всегда может гарантировать, что он действительно известен, гораздо лучше преобразовать его во что-то известное.

printf("Some message with %ld in the middle of it\n", (long) d);

Это хороший совет, действительный для любого типа. Например, чтобы напечатать PID Unix (типа pid_t):

pid_t pid = fork();
printf("Fork returned %d.\n", (int) pid);

Вам не нужно знать тип и размер pid, если целевой тип достаточно велик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...