![]() |
1
3
如果实现是完全不同的,最好不要使用预处理器条件,而是为每个平台使用单独的.c文件。每个都将包含在共享头文件中声明的相同函数的不同的、平台特定的实现。然后生成系统将选择正确的文件。 例如,在GLFW中, x11_window.c 和 win32_window.c ,并且两者都实现相同的函数,如_glfwplatformgetwindowsize()。 |
![]() |
2
3
在C++中这样做的一种流行的方法是使用接口抽象实现细节。 您可以使用这些代码来创建独立于平台的代码,它还可以帮助您处理不再支持API的情况。 例如,假设您有一个想要使用DirectX或OpenGL的引擎,您的类可能看起来像这样。
然后,当您初始化一个IEngine实例时,您的代码将特定于您创建的任何类型的引擎,但是您可以重用相同的接口代码,而不管实现上的不同。 |
![]() |
3
1
我从C++的角度回答问题。C的答案将会大不相同,我对提供任何建议都没有信心。有些原则可以很好地翻译,但有些则不行。 我建议您将特定于平台的代码隐藏在接口后面。在接口内部,提供一个静态函数来返回指向API的指针,但不要在不支持平台的代码版本中定义它。 然后在单独的文件中创建从该接口继承的不同类,这些文件是平台特定的。 在特定于平台的.cpp文件中,为接口中声明的静态函数提供定义。 对于不合适的平台,我建议您绝对从构建脚本中排除特定于平台的文件。如果不能做到这一点,您应该将它们全部包装在适当的ifdef子句中,但是很容易出错,而且不太可靠。 请注意,在这种情况下,在函数本身内部执行的计算可能是性能关键的——没关系。限制是这种函数不应该在紧密循环内调用,因为是虚拟函数调用。 如果您真的需要压缩每一盎司的性能,那么您可以摆脱接口,放松它提供的安全性和优雅性,只需在不同的.h/.cpp文件中实现相同的功能。如果你是用C语言写的话,这是你最可能做的事情——但是,我还是希望一些C专家对此发表意见。 最简单的例子如下:
|
![]() |
AstralHex · 矩阵乘法代码工作不正常 3 月前 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 4 月前 |
![]() |
Die4Toast · 递归调用成员箭头运算符-> 4 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 4 月前 |