2008-09-30 51 views
61

编译C或C++代码时,找出CPU架构的最可靠方法是什么?据我所知,不同的编译器有自己的一套非标准的预处理器定义(MSVS中的_M_X86,GCC中的__i386__,__arm__等)。编译时检测CPU架构

是否有标准检测我正在构建的体系结构的方法?如果不是,是否有各种编译器的这种定义的综合列表的来源,例如所有样板文件#ifdef s的标题?

+0

基本相同回答操作系统检测:http://stackoverflow.com/questions/142508/how-do-i-check-os-with-a-preprocessor-directive – 2015-04-20 16:34:07

回答

3

没有什么标准。 Brian Hook在他的“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中广泛使用(微软C++,GCC,英特尔CC ,也许TenDRA?)。只需决定您的应用程序将支持哪些编译器,列出它们的#defines,并根据需要更新您的标头。

+2

这在Visual Studio 2010上不适用于我。“_M_X86”没有定义(32位版本)。正确的是`_M_IX86`(上面的Serge链接)。 – Thomas 2013-12-15 08:20:17

-2

如果您需要对CPU功能进行细粒度检测,最好的方法是发送一个CPUID程序,该程序将标准输出或某些“cpu_config.h”文件输出到CPU支持的一组功能中。然后你将该程序与你的构建过程整合在一起。

3

如果你想倾倒在特定平台上所有可用的功能,你可以运行GCC,如:

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

这将转储马科斯像#define __SSE3__ 1#define __AES__ 1