什么是编译C或C ++代码时,发现CPU架构的最可靠的方法是什么? 据我所知,不同的编译器有自己的一套非标准的预处理器定义( _M_X86
在MSVS, __i386__
, __arm__
在GCC等)。
有没有检测到我建立了架构的标准呢? 如果没有,是否有这样的定义,对各种编译器的完整列表源,如所有的样板头#ifdef
S'
什么是编译C或C ++代码时,发现CPU架构的最可靠的方法是什么? 据我所知,不同的编译器有自己的一套非标准的预处理器定义( _M_X86
在MSVS, __i386__
, __arm__
在GCC等)。
有没有检测到我建立了架构的标准呢? 如果没有,是否有这样的定义,对各种编译器的完整列表源,如所有的样板头#ifdef
S'
下面是对一些信息的预先定义的架构宏和其他类型的预定义宏。
这个问题问它们被定义在GCC的源代码。
有没有编译器间的标准,但每个编译器往往是相当一致的。 你可以建立一个标题为自己这件事情是这样的:
#if MSVC
#ifdef _M_X86
#define ARCH_X86
#endif
#endif
#if GCC
#ifdef __i386__
#define ARCH_X86
#endif
#endif
没有太多点的完整列表,因为有成千上万的编译器,但只有3-4中广泛使用(微软C ++,GCC,英特尔CC,也许TenDRA?)。 只要决定哪些编译器您的应用程序将支持,列出他们的#define语句,并根据需要更新你的头。
如果您想倾倒在特定平台上所有可用的功能,你可以运行GCC这样的:
gcc -march=native -dM -E - </dev/null
这将转储像宏#define __SSE3__ 1
, #define __AES__ 1
,等等。
没有什么标准。 布赖恩·胡克记录这些一堆在他的“便携式开源线束”,甚至试图把他们弄成连贯和可用(因人而异关于这一点)。 请参阅本网站上的posh.h头:
请注意,上面的链接可能需要您前一段时间进入一些假的用户名/密码,由于DOS攻击。
如果你想有一个交叉编译器解决方案则只需使用Boost.Predef
包含
BOOST_ARCH_
系统/ CPU架构一个正在编制的。 BOOST_COMP_
编译器的人在使用。 BOOST_LANG_
语言标准之一是针对编译。 BOOST_LIB_C_
和BOOST_LIB_STD_在使用C和C ++标准库。 BOOST_OS_
操作系统,我们编译成。 BOOST_PLAT_
有关操作系统或编译器的顶部平台。 BOOST_ENDIAN_
的操作系统和架构组合的字节顺序。 BOOST_HW_
硬件的特定功能。 BOOST_HW_SIMD
的SIMD(单指令多数据)检测。 例如
#if defined(BOOST_ARCH_X86)
#if BOOST_ARCH_X86_64
std::cout << "x86_64 " << BOOST_ARCH_X86_64 << " \n";
#elif BOOST_ARCH_X86_32
std::cout << "x86 " << BOOST_ARCH_X86_32 << " \n";
#endif
#elif defined(BOOST_ARCH_ARM)
#if _M_ARM
std::cout << "ARM " << _M_ARM << " \n";
#elif _M_ARM64
std::cout << "ARM64 " << _M_ARM64 << " \n";
#endif
#endif
你可以找到更多关于如何使用它在这里
如果你需要一个精细的检测CPU的功能,最好的办法也是出货,输出到标准输出或一些“cpu_config.h”文件的一组由CPU所支持的功能CPUID程序。 然后,您可以集成构建过程中该程序。