检测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过程整合起来。