假设我在VC ++环境中有一个程序。 该程序需要自行修改,以便将某些代码用于不同的操作系统。
例如,假设程序将修改代码以A
执行Windows XP
,而Windows 7
修改代码以执行B
。
位于文件A
上的操作"a.h"
的代码和位于文件B
上的操作"b.h"
的代码。
假设我有一个功能,其目的是检测操作系统。 如果我希望通过检测操作系统来加载其中一个文件,我如何通过激活函数等术语来包含文件?
答案 0 :(得分:3)
你不能做暴露它的事情。
#include
机制由预编译器处理,它在编译时运行,而不是在运行时运行,因此,一旦编译了二进制文件,所有预编译器选项都已经完成并进入最终的可执行文件。
根据Windows的版本执行不同的操作,您必须包含两种行为的代码,并在运行时选择正确的行为,例如:使用GetVersionEx
API的结果。
答案 1 :(得分:2)
您暗示您希望使用预处理器有条件地构建不同的可执行文件,而不是影响运行时行为。这样做的结果是您将拥有每个不同操作系统的可执行文件。这可能是也可能不是你想要的,并带来了它自身的陷阱。
通常,除非您遇到的代码根本无法在任何其他环境中构建,否则值得避免使用条件编译。可能更好的解决方案是在运行时派生特定功能。这可以通过检测OS或通过配置等来完成。
有些方法可以在运行时专门动态加载库,您可能需要考虑这些方法。您可以使用Linux上的dlopen
系列函数来执行此操作(不确定Windows,但我确定有类似的东西。)一个缺点是,如果您的界面错误,那么检查很少,期待seg故障。此外,界面仅限于C链接。
答案 2 :(得分:1)
是的,因此完全可以在现代版和旧版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背后的功能。