Есть ли так или иначе от прогр C, чтобы найти, работает ли ОС в настоящее время в режиме на 64 бита или на 32 бита. Я использую простую программу как ниже
int main(void){
switch(sizeof(void*)){
case 4: printf("32\n");
break;
case 8: printf("64\n");
break;
}
}
Действительно ли это - корректный подход? Это кодировало бы работу во всех сценариях как, Если бы аппаратные средства составляют 64 бита, и ОС составляет 32 бита, что это возвратило бы? У меня нет машины для тестирования этого в различных конфигурациях.
Спасибо за совет.
В общем, 32-битный исполняемый файл не сможет определить, работает ли он в 64-битной ОС или в 32-битной (у некоторых ОС может быть способ определить , Я ничего не знаю, но я не искал), 64-битный исполняемый файл не будет работать в 32-битной ОС (если вы не учитываете возможность для 32-битной ОС эмулировать процессор, работающий под 64-битной ОС ...)
Результат sizeof () - это в основном константа времени компиляции, он не вернет что-то другое в зависимости от версии ОС, под которой он работает.
Что вы хотите знать на самом деле?
В дополнение к методам времени компиляции и если вы работаете под Windows: вызов IsWow64Process
( http://msdn.microsoft.com/en-us/library/ms684139.aspx ) вернет true
, если процесс является 32-битным и работает под 64-битной Windows.
В Windows вы можете посмотреть переменную среды PROCESSOR_ARCHITECTURE. Он вернет либо «x86», когда программа работает в 32-битном режиме (либо потому, что она работает в 32-битной ОС, либо потому, что она работает в 64-битной ОС, но как 32-битная программа под WOW64), либо либо «IA64. "или" AMD64 "при работе в качестве 64-битной программы в 64-битной ОС.
Я думаю, что ваше решение, вероятно, справедливо в большинстве случаев; конечно, во всех стандартных моделях данных IA64 указатели являются 64-битными. Однако теоретически это может быть справедливо не для всех архитектур. Возможно, будет безопаснее проверить sizeof(uintptr_t)
, если компилятор имеет заголовок C99; но опять же, это предполагает, что ширина адреса указывает на ширину регистра; зависит от того, подразумевается ли под "64-битным" диапазон адресов или диапазон целых чисел - они не обязательно должны быть одинаковыми.
Поскольку для компиляции 32- и 64-разрядных систем требуется либо другой компилятор, либо другой переключатель компилятора, целевая архитектура должна быть известна во время сборки и не должна определяться во время выполнения.
Большинство компиляторов предоставляют встроенные макросы архитектуры, позволяющие определить это во время сборки. Полный список таких макросов для различных компиляторов, ОС и архитектур приведен на: http://predef.sourceforge.net/
Чтобы ответить на ваш вопрос строго в соответствии с заданным:
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void) {
long wordBits = sysconf(_SC_WORD_BIT);
if (wordBits == -1 && errno == EINVAL)
return EXIT_FAILURE;
else
printf("%ld\n", wordBits);
return EXIT_SUCCESS;
}
Это будет работать в любой ситуации, когда glibc правильно настроен, и выведет размер вашего регистра в stdout, или вернет код выхода 1 в противном случае.
Единственный способ ответить на этот вопрос:
(1) Использовать какую-то специфичную для системы функцию (вызов API, переменную среды и т. Д.), Которая сообщит вам, 32- или 64-разрядная ОС.
или
(2) Используйте предоставленный компилятором макрос, который сообщит вам то же самое (если доступно).
Невозможно определить, какая у вас операционная система, с помощью каких-либо встроенных стандартных языковых функций. Они предоставляются компилятором и полностью независимы от ОС.