2008-09-30 3 views
61

Каков самый надежный способ узнать архитектуру процессора при компиляции кода на C или C++? Насколько я могу судить, у разных компиляторов есть собственный набор нестандартных определений препроцессора (_M_X86 в MSVS, __i386__, __arm__ в GCC и т. Д.).Обнаружение архитектуры архитектуры компиляции CPU

Есть ли стандарт Способ определения архитектуры, для которой я строим? Если нет, существует ли источник исчерпывающего списка таких определений для различных компиляторов, таких как заголовок со всем шаблоном #ifdef?

+0

В принципе то же самое ответ для обнаружения ОС: http://stackoverflow.com/questions/142508/how-do-i-check-os-with-a-preprocessor-directive – 2015-04-20 16:34:07

ответ

3

Нет ничего стандартного. Брайан Хук задокументировал кучу этих данных в своей «Portable Open Source Harness» и даже пытается превратить их в нечто последовательное и полезное (ymmv относительно этого). См заголовок posh.h на этом сайте:

Примечание, выше ссылка может потребоваться ввести некоторый фиктивный идентификатор пользователя/пароль, из-за атаки DOS некоторое время назад.

+5

-1, Boo для ссылок, требующих паролей. – paxos1977 2008-10-29 02:38:25

+2

Jeez - извините за фиктивную ссылку - она ​​должна быть http://hookatooka.com/poshlib/, которая дает информацию об идентификаторе пользователя/пароле. Мой браузер должен иметь «автоматический вход в систему» ​​из предыдущего посещения страницы. – 2009-04-09 21:20:02

+0

Хорошая ссылка! :) ..... – 2012-12-19 17:41:36

14

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

#if MSVC 
#ifdef _M_X86 
#define ARCH_X86 
#endif 
#endif 

#if GCC 
#ifdef __i386__ 
#define ARCH_X86 
#endif 
#endif 

Там нет особого смысла в полный список, потому что есть тысячи компиляторов, но только 3-4 широко используется (Microsoft C++, GCC, Intel CC , может быть, TenDRA?). Просто решайте, какие компиляторы будут поддерживать ваше приложение, перечислите их #defines и обновите свой заголовок по мере необходимости.

+2

Это не сработало для меня в Visual Studio 2010. `_M_X86` был положительно не определен (32-разрядная сборка). Правильный - `_M_IX86` (кредит на ссылку Сергея выше). – Thomas 2013-12-15 08:20:17

-2

Если вам требуется мелкомасштабное обнаружение функций ЦП, наилучшим подходом является отправка также программы CPUID, которая выводит на stdout или некоторый файл «cpu_config.h» набор функций, поддерживаемых процессором. Затем вы интегрируете эту программу с процессом сборки.

3

Если вы хотите сбросить все доступные функции на конкретной платформе, вы можете запустить GCC, как:

gcc -march=native -dM -E - </dev/null

Было бы отвалы Маркоса как #define __SSE3__ 1, #define __AES__ 1 и т.д.

Смежные вопросы