Как определить архитектуру платформенно-нейтральным способом?

У меня есть приложение на C ++, которое использует wxWidgets. Некоторые части приложения различаются для 32- и 64-битных хостов. В настоящее время я использую sizeof (void *), но есть ли лучший способ, использующий условную компиляцию и нейтральный к платформе?


person Nathan Osman    schedule 27.12.2009    source источник
comment
Какие вещи отличаются? Вызовы API или такие вещи, как размеры типов данных или что? Если API не сделает что-то глупое, вам не понадобятся подобные уловки.   -  person jalf    schedule 27.12.2009
comment
Он загружает 32-битную dll для одного и 64-битную dll для другого.   -  person Nathan Osman    schedule 28.12.2009


Ответы (4)


Обычно люди используют #defines для определения разрядности (точное определение будет зависеть от компилятора). Это лучше, чем подход во время выполнения с использованием sizeof (void *).

Что касается нейтральной платформы, ну, некоторые компиляторы работают на нескольких платформах.

person Terry Mahaffey    schedule 27.12.2009
comment
Как это будет выглядеть для gcc / Mingw32? - person Nathan Osman; 27.12.2009
comment
stackoverflow.com/questions/682934/ - person Terry Mahaffey; 27.12.2009

В зависимости от вашего компилятора у вас может быть доступ к макросам для конкретной платформы. Попробуйте поискать их документацию.

person dirkgently    schedule 27.12.2009

Все распространенные компиляторы имеют предопределенные макросы препроцессора, которые идентифицируют платформу. Например, если вы используете GCC, вы можете легко проверить их все:

touch foo.h; g++ -E -dM foo.h

который дает среди прочего

#define linux 1
#define __x86_64 1

для меня, так как я сейчас использую 64-битный Linux, и

#define __APPLE__ 1
#define __i386 1

на 32b OS X, я слышал.

Для Sun Studio 12 они задокументированы здесь < / а>. Кроме того, Sun Microsystems считает их частью API компилятора, поэтому совместимость обеспечивается. Например, в моем ящике Solaris у меня определены __SunOS__sparcv910 и __sparcv9 (подразумевается 64b).

В системах AIX с компилятором IBM xlc просмотрите поля /etc/vac.cfg и его options ключевых слов, чтобы найти предопределенные макросы. В системе, к которой у меня есть доступ, определены как минимум _AIX и более конкретные _AIX61, а также _POWER (на 64-битной PPC).

В HP-UX и его компиляторе aCC на itanium есть хотя бы макрос __ia64. Некоторые другие предопределенные макросы для ACC задокументированы здесь.

person okun    schedule 27.12.2009

Что плохого в использовании sizeof() там, где размер имеет значение? Компилятор с радостью оптимизирует его до константы.

person James    schedule 27.12.2009
comment
Но что тогда, если блок if использует функции, специфичные для архитектуры? - person Nathan Osman; 28.12.2009
comment
Конечно, они зависят от платформы, а не от архитектуры? в этом случае вы можете использовать макросы препроцессора. Если на той же платформе действительно есть архитектурно-зависимые функции (!), Я полагаю, вы могли бы использовать #if defined (). Хотя это звучит очень странно. - person James; 28.12.2009
comment
Нет. Например, Microsoft Text-to-Speech API инициализируется двумя разными способами для 32-битного и 64-битного режима. - person Nathan Osman; 28.12.2009
comment
Microsoft несет ответственность за много качественного кода, но если нет очень веской причины, это звучит как самое глупое дизайнерское решение за всю историю. - person James; 29.12.2009