Определения архитектуры процессора во время компиляции
какой самый надежный способ узнать архитектуру процессора при компиляции кода C или C++? Насколько я могу судить, разные компиляторы имеют свой собственный набор нестандартных определений препроцессора (_M_X86
в MSVS,__i386__
,__arm__
в GCC, и т. д.).
есть стандартный способ определить архитектуру, которую я строю? Если нет, есть ли источник для полного списка таких определений для различных компиляторов, таких как заголовок со всем шаблоном #ifdef
s?
5 ответов:
вот некоторые сведения о предопределенные макросы архитектуры и другие типы предопределенных макросов.
этот вопрос спрашивает, где они определены в исходном коде GCC.
нет никакого стандарта между компиляторами, но каждый компилятор имеет тенденцию быть вполне последовательным. Вы можете создать заголовок для себя что-то вроде этого:
#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 и обновите свой заголовок по мере необходимости.
Если вы хотите сбросить все доступные функции на определенной платформе, вы можете использовать GCC как:
gcc -march=native -dM -E - </dev/null
он будет сбрасывать Маркос, как
#define __SSE3__ 1
,#define __AES__ 1
и т. д.
там нет ничего стандартного. Брайан Хук задокументировал кучу из них в своем" портативном жгуте с открытым исходным кодом " и даже пытается превратить их во что-то связное и полезное (ymmv относительно этого). Посмотрите на шикарный.заголовок H на этом сайте:
обратите внимание, что ссылка выше может потребовать от вас ввести какой-то фиктивный идентификатор пользователя/пароль из-за атаки DOS некоторое время назад.