gpt4 book ai didi

c++ - C++ 的平台独立性。检测与编译

转载 作者:行者123 更新时间:2023-11-30 02:07:31 25 4
gpt4 key购买 nike

所以我想将我的应用程序构建为独立于平台,以便它可以在 Windows、OSX、Linux 等上运行。

例如,跨平台不同的主要“部分”之一是窗口。在 Windows 上它会使用 Win32 API,而在 OSX 和 Linux 上我猜它会使用其他东西。

我有一个 IWindow.h 类,它是一个用于与 Window 交互的接口(interface),还有一个 MSWindow 类,它封装了所有 Win32 函数并扩展了 IWindow 接口(interface)。

将来我会创建一个 OSXWindow 类等等

所以我的两个麻烦点是:

  1. 有时我需要检测我在哪个平台上运行并实例化正确的类。我想我必须为包含以及​​实例化本身做一些 ifdef block ?
    #ifdef RUNNING_WINDOWS    #include     #elif RUNNING_OSX    #include     #endif
    //m_window is declared as IWindow* m_window;    #ifdef RUNNING_WINDOWS    m_window = new MSWindow();    #elif RUNNING_OSX    m_window = new OSXWindow();    #endif

Obviously RUNNING_WINDOWS and RUNNING_OSX are made up so if anyone knows actual flags I can lookup that would be appreciated.

  1. My main.cpp entry point is currently on Windows.
    //Main Entry point to windows application    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

And the hInstance must be passed to the MSWindow class. This presents a bit of a problem in that my IWindow interface can't take in an HINSTANCE because HINSTANCE is part of Windows and won't exist on OSX or Linux. Would I have separate entry point functions in my main.cpp blocked by the ifdefs?

And would IWindow have an Init function that takes in different parameters based on ifdefs as well?

#ifdef RUNNING_WINDOWS
bool Init(HINSTANCE* hInstance);
#elif RUNNING_OSX
bool Init(Whatever OSX needs);
#endif

我可能会把这一切都弄错,所以希望那是你能介入的地方,让我走上正确的道路。

谢谢!

编辑:

根据下面的评论,我将添加更多关于我的目标的信息。

本质上,我有一个核心类,它是我的应用程序。我的 main.cpp 实例化了这个 Core 类的一个实例,仅此而已。

Core 类将有一个 Window 类的实例。 Core 根本不应该关心它是什么类型的 Window,它只需要与之交互。

我收集到的 Window 本身(根据下面的评论)将在内部处理平台独立性方面。因此,Window 可能由于 #ifdef block 而变得困惑,但应用程序的其余部分以及与 Window 交互的任何内容都不会在意。

我采取的另一个选择和第一个方向是,对于派生自公共(public) IWindow 接口(interface)的每个“类型”的 Window 实现都有单独的类。然后#ifdefs 将在要实例化和包含的类型的核心中发生。虽然这将跨操作系统的实现分开,但我同意它确实会使核心困惑,如果应用程序的任何其他 future 部分需要引用窗口,它也需要有 #ifdef block ,这只会导致整体代码更加困惑。

最佳答案

实际上,实现此目的的最佳方法是通过创建一些包装窗口的类来封装窗口的整个概念。然后,此类可以通过非 API 特定函数提供所需的接口(interface),因此使用它的对象甚至不需要知道 Win32 API、GTK 或您将要使用的任何其他窗口系统的工作原理。简而言之,您不想每次需要启动窗口时都必须使用 #ifdef,而是想将它们隐藏在其他类中。我用过 Qt Framework作为一个非常强大的跨平台框架,它可以做到这一点,并允许在 Windows、Mac、Linux 和其他平台上编译相同的 C++。它提供对窗口系统、网络连接、线程、媒体播放、文件系统访问等的跨平台标准化访问。

如果您真的想重新发明轮子并编写自己的包装器类,您应该查看定义的编译器特定宏,以确保您想要支持的平台就位。这是一个寻找什么的好地方 macros are defined on what platforms by what compilers .一些常见的宏是用于 Visual Studio 编译的 _WIN32 和用于基于 Unix 的平台的 __unix__。

关于c++ - C++ 的平台独立性。检测与编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7779742/

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