C++ 按条款包含文件
Posted
技术标签:
【中文标题】C++ 按条款包含文件【英文标题】:C++ include files by terms 【发布时间】:2012-12-31 14:33:54 【问题描述】:假设我在 VC++ 环境中有一个程序。 该程序需要修改自身,以便将某些代码用于不同的操作系统。
例如,假设程序将修改代码为 A
为 Windows XP
和 Windows 7
它将修改代码为 B
。
操作A
的代码位于文件"a.h"
上,操作B
的代码位于文件"b.h"
上。
假设我有一个函数,其目的是检测操作系统。 如果我想通过检测操作系统只加载其中一个文件,如何通过激活功能等术语包含文件?
【问题讨论】:
有点不清楚您到底想要做什么 - 您是否想要两个不同的可执行文件,一个用于 Windows XP,另一个用于 Windows 7?或者一个可执行文件来处理两者? “修改代码”是什么意思? @MatsPetersson 我想要一个可执行文件来处理这两个问题。我的程序应该使用网络适配器。当我继续我的程序时,我发现它适用于 Windows XP 并且没有其他任何东西。因此,我发现自从 windows vista 以来,网络适配器发生了一些变化。好吧,我不想创建两个可执行文件,而是创建一个可以正确维护适配器的单个可执行文件。 【参考方案1】:你不能做你暴露它的事情。
#include
机制由预编译器处理,它在编译时运行,而不是在运行时运行,因此,一旦你的二进制文件被编译,所有的预编译器选择已经做出并进入最终可执行文件。
要根据 Windows 的版本执行不同的操作,您必须包含两种行为的代码并在运行时选择正确的行为,例如使用GetVersionEx
API 的结果。
【讨论】:
如果代码不小,可以将其编译为库,然后在运行时加载相应的库。 @diolemo:当然,但这又是由运行时检查触发的运行时行为,而不是按照他的要求使用预编译器完成的检查。 是的,库需要作为运行时加载。 @diolemo:我的评论是你评论的一个规范:)对不起,我不是故意的。 @MatteoItalia 非常感谢。事实上,当我想到我的要求时,我发现这样的事情是做不到的。 diolemo 也谢谢你:) 我会照你说的做【参考方案2】:您暗示您希望使用预处理器有条件地构建不同的可执行文件,而不是影响运行时行为。这样做的结果是您将拥有每个不同操作系统的可执行文件。这可能是也可能不是你想要的,并带来了它自己的陷阱。
一般来说,避免条件编译是值得的,除非您的代码根本不会在任何其他环境中构建。可能更好的解决方案是在运行时派生特定功能。这可以通过检测操作系统或配置等来完成。
您可能需要考虑一些专门在运行时动态加载库的方法。您可以在 Linux 上使用dlopen
系列函数来执行此操作(不确定 Windows,但我确信有类似的东西。)一个缺点是几乎没有检查方法,所以如果您弄错了界面,请看转发到段错误。此外,接口仅限于 C 链接。
【讨论】:
在 Windows 上,您可以使用 LoadLibrary() 在运行时加载库。【参考方案3】:是的,因此完全有可能创建在现代和旧版本的 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 后面的功能。
【讨论】:
以上是关于C++ 按条款包含文件的主要内容,如果未能解决你的问题,请参考以下文章