2013-06-21 2 views
1

Я видел много людей, которые задавали вопросы портирования с 32-битной до 64-битной машины. Но разве это не является общим для кода порта, написанного на 64-битной до 32-битной. Я пытаюсь портировать плагин с 64-битной до 32 бит в C, но сталкивается с подобными проблемами в таких случаях, как хранение void * до 64-битных целых чисел и наоборот.Портирование 64-битного кода на 32-битный компьютер

Что нужно делать при изменении кода, так что тот же код работает на обеих машинах (i386 & x86_64)? Я не думаю, что имеет смысл использовать uint64_t * на 32-битной машине вместо void *, которая является 32-битной? Существует ли какой-либо обобщенный подход для таких случаев?

+1

Указатели никогда не должны храниться в целых числах фиксированного размера. Если вам нужно сохранить указатель в целочисленном типе, правильный тип - 'uintptr_t', но вы действительно не должны хранить указатели в целых объектах вообще. –

ответ

0

Указатели никогда не должны храниться в целых числах фиксированного размера. Если вам нужно сохранить указатель в целочисленном типе, правильный тип - uintptr_t, но вы действительно не должны хранить указатели в целых объектах вообще. Однако, нет никакого реального вреда в использовании целочисленного типа, который слишком велик; это просто растратит немного памяти. Поэтому, если сохранение указателей в uint64_t является единственной проблемой в вашем коде, она должна отлично работать для 32-битных целей.

+0

Спасибо, Так что в случаях, когда 'uint64_t' приписывается' void *', мы должны просто заменить его на 'uintprt_t', и все предупреждения должны уйти без каких-либо побочных эффектов для обеих архитектур. На самом деле в моем случае адрес хранится в целых числах, потому что позже они используются для сравнения. – Abhishek

+0

Код должен работать как есть. Я не уверен, что вы подразумеваете под «заменой» на 'uintptr_t', поэтому, пожалуйста, уточните. –

+0

Наконец, я могу решить эту проблему, заменив все целые числа, которые хранят адреса' uintptr_t' на месте 'uint64_t'and делал подобный материал во время typecasting. Спасибо. – Abhishek

0

Как вы знаете, вы можете написать один исходный код для 32-битной и 64-битной архитектуры с серией «#define», «#defef» и т. Д., Которые являются предпроцессорными директивами. Вам нужно скомпилировать источник один раз для 32 бит и 64 бит каждый. Это может быть что-то вроде этого.

test.c образец кода

#ifdef ARCH_64 
    typedef UINT unit64_t; 
#else 
    typedef UINT unit32_2; 

UINT *my_uint_ptr; 

$ НКУ -m32 test.c

$ НКУ -m64 -DARCH_64 test.c

+0

Если нам нужно определить 'unsigned int', то это можно сделать очень просто, просто используя' size_t', и он будет автоматически заменен компилятором в зависимости от архитектуры. – Abhishek

+0

Это правда. я лишь даю пример для записи одного исходного кода для 32-битного и 64-битного и компиляции его ... – CancerSoftware