假设我在 VC++ 环境中有一个程序。该程序需要修改自身才能将某些代码用于不同的操作系统。
例如,假设程序将修改代码为 do和 forA
它将修改代码为 do 。位于文件上的操作代码和位于文件上的操作代码。Windows XP
Windows 7
B
A
"a.h"
B
"b.h"
假设我有一个功能,其目的是检测操作系统。如果我希望通过检测操作系统仅加载其中一个文件,如何通过激活功能等术语包含文件?
假设我在 VC++ 环境中有一个程序。该程序需要修改自身才能将某些代码用于不同的操作系统。
例如,假设程序将修改代码为 do和 forA
它将修改代码为 do 。位于文件上的操作代码和位于文件上的操作代码。Windows XP
Windows 7
B
A
"a.h"
B
"b.h"
假设我有一个功能,其目的是检测操作系统。如果我希望通过检测操作系统仅加载其中一个文件,如何通过激活功能等术语包含文件?
你不能做你暴露它的事情。
该#include
机制由预编译器处理,它在编译时运行,而不是在运行时运行,因此,一旦你的二进制文件被编译,所有的预编译器选择都已经做出并进入最终的可执行文件。
要根据 Windows 的版本做不同的事情,您必须包含两种行为的代码并在运行时选择正确的行为,例如使用GetVersionEx
API 的结果。
您暗示您希望使用预处理器有条件地构建不同的可执行文件,而不是影响运行时行为。这样做的结果是您将拥有每个不同操作系统的可执行文件。这可能是也可能不是你想要的,并带来了它自己的陷阱。
一般来说,避免条件编译是值得的,除非你的代码根本不会在任何其他环境上构建。可能更好的解决方案是在运行时派生特定功能。这可以通过检测操作系统或配置等来完成。
您可能需要考虑一些专门在运行时动态加载库的方法。您可以使用dlopen
Linux 上的函数族来执行此操作(不确定 Windows,但我确信有类似的东西。)一个缺点是几乎没有检查方法,因此如果您弄错界面,请期待 seg故障。此外,接口仅限于 C 链接。
是的,因此完全有可能创建在现代和旧版本的 Windows 上运行的可执行文件。执行此操作的典型方法是检查实际版本,然后更改代码。MS在这里告诉你如何检查版本:
http://msdn.microsoft.com/en-gb/library/windows/desktop/ms724429(v=vs.85).aspx
然后你只需做一个标志,说它bool isWndowsXP
是由检查代码设置的,并且在相关的地方做if(isWindowsXP) do_stuff_xp_way(); else do_stuff_otherway();
如果您需要更具体的建议,您确实需要提供隐藏在问题中 A 和 B 后面的功能。