Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Кроссплатформенный код

1.8K
08 марта 2007 года
igor_nf
256 / / 13.12.2006
Всем доброго времени суток. Итак. Предположим, мы пишем код, который должен выполняться в разных операционных системах. Например, я встречал такое решение:
#ifdef linux
int main(int argc, char* argv[]) {
...линукс код...}
#else
int APIENTRY WinMain(...){
...виндовый код...}
#endif
Не могу понять следующего: как всё таки компилятор узнает, что за система? Насколько я понимаю, компилятор, встретив #ifdef должен определить тип системы. Он сможет узнать о системе в зависимости от того, определено ли linux (см. выше). Где оно может быть определено?
1.9K
08 марта 2007 года
SABROG
242 / / 26.01.2006
В Makefile'e ?
361
08 марта 2007 года
Odissey_
661 / / 19.09.2006
Да хоть в Makefile, хоть спецально хедер для этого выдели. =)
В некоторых случаях тип ос можно узнать из переменной окружения.
391
08 марта 2007 года
Archie
562 / / 03.02.2005
Обычно компилятор генерирует код под систему, в которой он сам же и работает (поэтму ему и не нужно вообщем-то ее определять). Для кросс-компиляторов используется ключик (типа, -target), чтобы он знал, под что ему генерить код.
1.8K
08 марта 2007 года
igor_nf
256 / / 13.12.2006
В общем то понятно. Но тогда другой пример. Берём типы со строго фиксированным размером. Можно определить так:

#ifdef x86_64
typedef unsigned long u64
#else
typedef unsigned long u32

Будет ли это корректно? Можно ли с уверенностью утверждать, что код на платформах 32 и 64 будет выполняться так, как мне нужно?
3
09 марта 2007 года
Green
4.8K / / 20.01.2000
Цитата: igor_nf

Будет ли это корректно? Можно ли с уверенностью утверждать, что код на платформах 32 и 64 будет выполняться так, как мне нужно?


Смотря что за код...

Кстати, название темы не совсем корректно: ты путаешь понятия кроссплатформенность и мультиплатформенность.

309
09 марта 2007 года
el scorpio
1.1K / / 19.09.2006
Код, скомпилированный на 32x платформе, на 64x выполняться будет нормально. Просто в 32x разрядном режиме.

А вот наоборот работать не будет вообще :(
1.8K
09 марта 2007 года
igor_nf
256 / / 13.12.2006
Насчёт своего предыдущего вопроса поясню. Мне известно, что на платформах 64 тип unsigned long имеет размер 64 бита (по крайней мере это справедливо для Linux). Соответственно на платформах 32 - 32 бита. Поместив в хедер то, что я написал выше, я смогу использовать в своей программе типы u32 и u64 и они будут занимать соответственно 32 и 64 бита в памяти независимо от размера машинного слова процессора. Меня смущает одно: правильно ли я написал #ifdef?

А кстати, раз уж зашёл разговор, тогда в двух словах обьясните понятие кроссплатформенности, если мы говорим о мультиплатформенности.
1.9K
13 марта 2007 года
[*]Frosty
278 / / 17.06.2006
Вот кое-что. Может поможет)
статья

 
Код:
#ifdef x86_64
typedef unsigned long u64
typedef unsigned int u32
#endif
#ifdef x86_32 // ??? уточни константы имя
typedef unsigned long long u64
typedef unsigned long u32
#endif
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог