C ++按术语包含文件

时间:2012-12-31 14:33:55

标签: c++ visual-c++ include preprocessor-directive

假设我在VC ++环境中有一个程序。 该程序需要自行修改,以便将某些代码用于不同的操作系统。

例如,假设程序将修改代码以A执行Windows XP,而Windows 7修改代码以执行B。 位于文件A上的操作"a.h"的代码和位于文件B上的操作"b.h"的代码。

假设我有一个功能,其目的是检测操作系统。 如果我希望通过检测操作系统来加载其中一个文件,我如何通过激活函数等术语来包含文件?

3 个答案:

答案 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背后的功能。