Подтвердить что ты не робот

Есть ли директива препроцессора GCC, чтобы проверить, компилируется ли код на 64-битной машине?

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

#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 или исходный код.

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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