Определения архитектуры процессора во время компиляции


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

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

5 66

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 некоторое время назад.

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