1
我目前正在設計一個API,它允許用戶傳遞一個不透明的指針,當他要實現的接口的方法被調用時,他將在稍後傳回。應該使用未命名的結構體還是未定義的標籤來實現不透明指針?
這基本上下降到以下幾點:
API方:
class IAPIInterface
{
public:
virtual void APIMethod(CustomContext ctx) = 0;
}
void SetInterface(IAPIInterface* api, CustomContext ctx);
用戶側:
class UserInterfaceImpl : public IAPIInterface
{
public:
virtual void APIMethod(CustomContext ctx) {...}
};
UserInterfaceImpl* userInterfaceImpl = new UserInterfaceImpl();
struct UserContext {...} userContext;
SetInterface(userInterfaceImpl, &userContext); // May need a cast
什麼是定義在一個不透明的指針的最佳方式場景?
基本上我想到了 typedef struct _CustomContext* CustomContext;
它定義了一個指向未定義(正向聲明)結構的指針。
但我還想知道是否 typedef struct {} * CustomContext;
定義指向未命名結構的指針可能是一個好的選擇?我看到的主要問題是,如果包含在不同的翻譯單元中,它可能會定義不同的結構。它是否正確?
當然,由於類型安全問題,我不想使用void*
。
1)因爲'void *'不提供類型安全;任何事情都可以在未經同意的情況下投給「無效*」。要求明確演員陣容更好,用戶的意圖應該是顯而易見的。 2)我簡化了我的例子,但它不是C,它的意思是C++。 問題的主要觀點是'typedef'ed未定義結構指針'和'typedef'ed無名結構指針'之間的技術/語義差異。 – HiroshimaCC