У меня есть приложение на C ++, которое использует wxWidgets. Некоторые части приложения различаются для 32- и 64-битных хостов. В настоящее время я использую sizeof (void *), но есть ли лучший способ, использующий условную компиляцию и нейтральный к платформе?
Как определить архитектуру платформенно-нейтральным способом?
Ответы (4)
Обычно люди используют #defines для определения разрядности (точное определение будет зависеть от компилятора). Это лучше, чем подход во время выполнения с использованием sizeof (void *).
Что касается нейтральной платформы, ну, некоторые компиляторы работают на нескольких платформах.
В зависимости от вашего компилятора у вас может быть доступ к макросам для конкретной платформы. Попробуйте поискать их документацию.
Все распространенные компиляторы имеют предопределенные макросы препроцессора, которые идентифицируют платформу. Например, если вы используете 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
и __sparcv9
10__sparcv9
(подразумевается 64b).
В системах AIX с компилятором IBM xlc просмотрите поля /etc/vac.cfg
и его options
ключевых слов, чтобы найти предопределенные макросы. В системе, к которой у меня есть доступ, определены как минимум _AIX
и более конкретные _AIX61
, а также _POWER
(на 64-битной PPC).
В HP-UX и его компиляторе aCC на itanium есть хотя бы макрос __ia64
. Некоторые другие предопределенные макросы для ACC задокументированы здесь.
Что плохого в использовании sizeof()
там, где размер имеет значение? Компилятор с радостью оптимизирует его до константы.