我从C++的角度进行回复。对于C语言来说,答案会大不相同,因此我不确定是否能提供任何建议。其中一些原则可以很好地转化,但有些则不能。
我建议您将特定于平台的代码隐藏在接口后面。在接口内部,提供一个静态函数来返回指向API的指针,但不要在您的跨平台代码版本中定义它。
然后,您可以创建不同的类继承自该接口,在单独的文件中,这些文件是特定于平台的。
在特定于平台的.cpp文件内,您提供了在接口中声明的静态函数的定义。
我建议您绝对从不适当的平台的构建脚本中排除特定于平台的文件。如果失败了,您应该将它们全部包装在适当的ifdef子句中,但很容易出错并且不太可靠。
请注意,在这种情况下,函数本身内部执行的计算可能是性能关键的 - 这没问题。限制是这种函数不应在紧密循环内调用,因为会涉及虚函数调用。
如果您真的需要挤出每一点性能,您可以放弃接口,失去它提供的安全和优雅,并仅在不同的.h / .cpp文件中实现相同的功能。如果您使用C编写,您很可能会这样做 - 但是,我更喜欢一些C专家发表他们的意见。
一个最小化示例可能如下所示:
MyPlatformSpecificAPI.h
class MyPlatformSpecificAPI
{
public:
virtual ~MyPlatformSpecificAPI() = default;
static MyPlatformSpecificAPI* getPlatformSpecificAPI();
virtual uint8_t myPlatformSpecificFoo(uint32_t bar) = 0;
MyPlatformSpecificAPI(const MyPlatformSpecificAPI&) = default;
MyPlatformSpecificAPI(MyPlatformSpecificAPI&&) = default;
MyPlatformSpecificAPI& operator=(const MyPlatformSpecificAPI&) = default;
MyPlatformSpecificAPI& operator=(MyPlatformSpecificAPI&&) = default;
};
MyPlatformSpecificAPI_Windows.h
#include "MyPlatformSpecificAPI.h"
class MyPlatformSpecificAPI_WIN64 : public MyPlatformSpecificAPI
{
public:
virtual uint8_t myPlatformSpecificFoo(uint32_t bar) override;
static MyPlatformSpecificAPI_WIN64 s_API;
};
MyPlatformSpecificAPI_Windows.cpp
uint8_t MyPlatformSpecificAPI_WIN64::myPlatformSpecificFoo(uint32_t bar)
{
//Perform windows specific calculations
return 42; //because 42 is always the answer
}
MyPlatformSpecificAPI* MyPlatformSpecificAPI::getPlatformSpecificAPI()
{
return &MyPlatformSpecificAPI_WIN64::s_API;
}
MyPlatformSpecificAPI_Xbox.h
#include "MyPlatformSpecificAPI.h"
class MyPlatformSpecificAPI_Xbox : public MyPlatformSpecificAPI
{
public:
virtual uint8_t myPlatformSpecificFoo(uint32_t bar) override;
static MyPlatformSpecificAPI_Xbox s_API;
}
MyPlatformSpecificAPI_Xbox.cpp
uint8_t MyPlatformSpecificAPI_Xbox::myPlatformSpecificFoo(uint32_t bar)
{
//Perform Xbox specific calculations
return 84;
};
MyPlatformSpecificAPI* MyPlatformSpecificAPI::getPlatformSpecificAPI()
{
return &MyPlatformSpecificAPI_Xbox::s_API;
}
#ifdef
将导致不必要的代码重复。 - jan.sende