检测CPU架构的编译时间

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

有没有一种标准的方法来检测我正在构build的架构? 如果没有,是否有各种编译器的这种定义的综合列表的来源,例如所有样板#ifdef的标题?

以下是有关预定义架构macros和其他types的预定义macros的一些信息。

没有内部编译器标准,但每个编译器往往是相当一致的。 你可以为自己创build一个头像这样的东西:

 #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,并根据需要更新你的头。

没有什么标准。 Brian Hook在他的“Portable Open Source Harness”中logging了其中的一些内容,甚至试图使它们变得连贯和可用(ymmv)。 请参阅本网站上的posh.h标题:

请注意,前段时间,由于DOS攻击,上面的链接可能会要求您input一些伪造的用户名/密码。

如果您想在特定平台上转储所有可用的function,您可以运行GCC:

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

它会像#define __SSE3__ 1#define __AES__ 1等转储Marcos

如果您需要对CPUfunction进行细粒度检测,最好的方法是发送一个CPUID程序,将CPU输出到stdout或某些“cpu_config.h”文件的CPUfunction集。 然后你把这个程序和你的构build过程整合起来。