LINUX.ORG.RU

[C/C++][x32, x64] Как узнать разрядность платформы на этапе препроцессинга?


0

1

Здравствуйте!


Вопрос в следующем. Существует ли какой-нибудь кроссплатформенный метод определения разрядности платформы на этапе препроцессинга?

Гоголь показывает только:

#ifdef _WIN64

и какое-то дикое обсуждение:

http://ru.w3support.net/index.php?db=so&id=735647

Но нам нужно другое - способ, работающий и в GCC Linux, и в винде, и с разными компиляторами.

У кого-нибудь готовое условие не завалялось?

Вот потому что ищещь по виндовым терминам, потому и находишь только win64. Эти архитектуры называются x86, amd64/x86-64.

dmitry_vk ★★★
()
Ответ на: комментарий от lazyklimm

я имею в виду 32-хбитный процессор. Все процессоры, выпущенные за последние года 3 имеют 64-битную архитектуру. Давайте все таки не считать пользователей за дуарков, которые будут ставить 32-хбитную ОС на 64-хбитный процессор.

JFreeM ★★★☆
()
Ответ на: комментарий от Lorchanko

> А корректно ли определять через размер size_t?

технически - да, но в стандарте, насколько я знаю, размер size_t не указан, т.е. может зависеть от реализации

aho
()
Ответ на: комментарий от JFreeM

> Давайте все таки не считать пользователей за дуарков, которые будут ставить 32-хбитную ОС на 64-хбитный процессор.

Но такие есть, и им пофигу на разрядность.

cipher ★★★★★
()
Ответ на: комментарий от JFreeM

да? Жаль

Пересади меня! А то мне с моим старым ноутом у которого всего 1гб памяти и процом core duo который не держит 64бита как-то ссыкотно переходить.

true_admin ★★★★★
()
Ответ на: комментарий от nanonymous

ясно, да - по названию можно было догадаться, поверил описанию

aho
()
Ответ на: комментарий от JFreeM

Но зачем? Если памяти меньше 4G, Вы ничего не выиграете, а наоборот, т.к. 64х-битные приложения требуют больше памяти.

wholeman
()

Это действительно нужно? Обычно лучше использовать типы известного размера, например int64_t, u_int32_t и т.п. (см. /usr/include/sys/types.h).

wholeman
()
Ответ на: комментарий от TERRANZ

где написано? на intel.com ? и да, поздние p4 держали x86-64

Reset ★★★★★
()
Ответ на: комментарий от lazyklimm

на винде оно sizeof(long) не зависит от архитектуры x86/x86-64

Reset ★★★★★
()

Я бы распарсил в cmake uname. Или из /proc можно попытаться информацию извлечь. А вот как это сделать в мастдае - понятия не имею.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от arsi

Осторожнее надо. IMO сей компилятор - второй по распространённости, если не первый.

wholeman
()
Ответ на: комментарий от baverman

Зато для линукса это самое простое решение. А как там в мастдае - понятия не имею. Но для cmake можно сделать проверку на ОС и, в зависимости от нее, вызывать тот или иной велосипед.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

кроccкомпиляция подразумевает сборку и под линукс, но другой архитектуры, как самый простой вариант - 32 бита из под 64-битной системы

aho
()
Ответ на: комментарий от aho

У ТСа такой задачи не было. Так что не запутывайте.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от aho

И, кстати, ЕМНИП, без ВМ не получится (я уже как-то пытался себе дженту 64-битную закомпилять, не пользуясь ВМ - ничего не вышло).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от aho

В мане написано, что это для сборки вроде 32бита из-под 64-х. Но что-то у меня, несмотря на всякие ключики в make, 64-битное ядро компилироваться 32-битным gcc не стало.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

> Но что-то у меня, несмотря на всякие ключики в make, 64-битное ядро компилироваться 32-битным gcc не стало.

КО говорит, что ты просто не умеешь

aho
()
Ответ на: комментарий от Eddy_Em

Зато для линукса это самое простое решение.

Заканчивай уже пить пиво, оно у вас там с веществами, однозначно.

baverman ★★★
()
Ответ на: комментарий от Eddy_Em

Сделать проверку компилятора проще на порядки. И безо всяких cmake, а прямо в коде. Для Windows есть набор define'ов, которые устанавливают все компиляторы, а в Linux с вероятностью 99% используется GCC. Способа, который работал бы везде и всегда, AFAIK нет. Даже если бы он был в стандартах, всегда найдётся кто-нибудь, кто им соответствует не полностью.

wholeman
()
Ответ на: комментарий от wholeman

> Молодцы, оперативно работают.

ну им еще http://gcc.gnu.org/projects/cxx0x.html догонять и догонять, и, как я понял, для Visual Studio vNext более-менее полная поддержка C++0x не ставится как задача

aho
()

>Существует ли какой-нибудь кроссплатформенный метод определения разрядности платформы на этапе препроцессинга?

Для начала надо определить понятие разрядности платформы. И преследуемые цели. Правильная постановка вопроса - это половина ответа. Иначе будет «что 100? а что приборы?». Реализация С на 64-битовой платформе теоретически может быть полностью 32-битовой (без 64-битовых целых типов и указателей). Как и наоборот.

Кроссплатформенны CHAR_BIT, sizeof, limits.h.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.