你应该知道你代码编译的目标平台

有时候我会碰到下面这个问题:

我怎么通过编程的方式知道我的程序会编译成哪个目标平台?我希望我的程序的 x86 版本的行为和 ia64 版本有所区别。有什么 API 可以用来调用吗?

请注意,以上问题不是问当前程序是否运行在一个 64 位 Windows 系统上。而是想知道程序是否被一个 x86 编译器,还是一个 ia64 编译器所编译。

但是,我所不能理解的是,你为什么需要一个 API 呢?你应该已经知道你代码编译的目标平台了,因为编写代码的人就是你啊!

在 Microsoft Visual C++ 编译器中,已经预定义好了一些符号,用来指示目标平台。

#ifdef _M_IX86
// the target architecture is x86
#else
// the target architecture is something else
#endif

如果你不希望你的代码绑定到一个特定的编译器,你需要将此要求明确地表达出来。例如,你可以在 x86 makefile 中向编译器开关传入一个 DBUILDING_FOR_x86 标志,然后在 ia64 makefile 中传入一个 DBUILDING_FOR_ia64。
这也是 Windows DDK 编译工具所使用的方法:DDK 的 makefile 系统定义了一些列标志用来适配不同的编译环境。

// assumes you use makefile.def
#if defined(_X86_)
// the target architecture is x86
#elif defined(_IA64_)
// the target architecture is Intel ia64
#elif defined(_AMD64_)
// the target architecture is AMD x86-64
#else
// some other architecture
#endif

正如我之前的一篇文章中所提到的,你还可以使用 _WIN64 来检测目标平台是否是一个 64 位的 Windows 系统。

但关键是,这都是你可以自己控制的事情。你就是那个编写程序的人。
你应该知道目标平台是什么,没有必要要求别人告诉你一些已经完全在你自己控制之下的事情。

总结

除非万不得已,尽可能的编写通用平台代码,因为你无法假设是 x64 平台用的人多,还是 x64 用的人多。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《You already know what your target architecture is (or at least you should)》

你应该知道你代码编译的目标平台_第1张图片

你可能感兴趣的:(OldNewThing,软件开发,系统设计,windows)