gpt4 book ai didi

c++ - 如何从特定于平台的头文件中提取代码

转载 作者:行者123 更新时间:2023-11-30 04:29:20 26 4
gpt4 key购买 nike

您好,我正在尝试找到一种方法来防止包含特定于平台的头文件,例如 windows.h。奇怪的是,我发现的解决方案没有一个令我满意。也许无法实现。

我认为要实现这个目标需要使用几种技术。互联网上有很多例子,但我找不到任何关于一个方面的例子。有些东西必须与你的抽象对话/创造。这是一个例子:

这是渲染窗口渲染目标的真正简化版本。

//D3D11RenderWindow.h
#include <d3d11.h>
class D3D11RenderWindow: public GfxRenderWindow
{
public:
bool initialize(HWND windowHandle);

private:
HWND windowHandle_; /// Win32 window handle
};

这不是什么大问题,这是一个平台特定代码,只能由平台特定代码包含。但是我们需要实际实例化这种类型,因此“入口点”也需要了解平台特定代码。

例如一个工厂类:

//GfxRenderWindowFactory.h
#define WIN32_LEAN_AND_MEAN
#define NOMINMAX
#include <windows.h>

class GfxRenderWindow;

class GfxRenderWindowFactory
{
public:
static std::unique_ptr<GfxRenderWindow> make(HWND windowHandle);
};

现在这个工厂类需要被库的“客户端”包含(这里是渲染器)。我不喜欢的是 #include "windows.h",因为它对我来说太容易出错了,任何包含它的人,即使他们不需要它也会拥有所有的世界和 window ....预编译header 不是一个解决方案,因为它现在由编译器强制执行,所有 cpp 都包含它(它是加快编译时间的宝贵工具,但不是将平台特定代码与可移植代码分开的工具)

我的想法是将#include 放在cpp 中,而不是像这样放在头文件中:

//GfxRenderWindowFactory.cpp
#define WIN32_LEAN_AND_MEAN
#define NOMINMAX
#include <windows.h>
#include "GfxRenderWindowFactory.h"

/// Implementation of GfxRenderWindowFactory goed here ....

这样它会强制任何想要使用此类的人包含相关的平台特定 header ,他们将能够更好地判断他们是否将此 header 包含在错误的地方,比如在他们自己的 header 文件之一中。

您对此有何解决方案?你觉得我的解决方案怎么样?疯了?

我想指出的是,对我来说,正确编写可移植代码非常重要!像只包含 windows.h 并且不要担心它这样的答案不是有效的答案。这对我来说不是一个好的编码习惯。

我希望我把我的问题说清楚了。如果不告诉我,我会澄清

非常感谢!

## 编辑##通过与 hmjd 的一次小谈话,我想在头文件中保留 windows.h,因为我同意,这使它更有用。因此,最好有一种方法来防止包含在头文件中,并且通过这种方式强制该文件只能包含在 cpp 中。这可能吗?

最佳答案

正在使用预定义的宏,如 WIN32,或者您的构建系统定义的宏不够:

#ifdef WIN32
#include <windows.h>
#else
include other platform specific headers
#endif

这是一种常见的方法(FWIW 是我用过的唯一方法)。

关于c++ - 如何从特定于平台的头文件中提取代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9422342/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com