[英]struct keyword in C++ typedef
我看着格列(Glew)的標題,遇到了一個對我提出疑問的東西:
// C
typedef struct __GLsync *GLsync;
我知道Glew是一個C庫,因此不同於C ++,並且我知道這是C ++中的有效代碼:
// C++
struct S { ... }; // S defined in the class name space
void f( S a ); // struct is optional
我的問題是,從C ++的typedef
中刪除struct關鍵字並將其包含在僅C ++的項目中是否安全?
typedef /*struct*/ __GLsync *GLsync;
如果沒有,當我使用struct
關鍵字而不使用typedef
有什么區別?
以下形式的typedef:
typedef struct S *SPtr;
不需要先驗知識相同翻譯單元中的S
它假定某些結構S
的前向聲明和別名SPtr
作為指向相同的指針類型。 但是,這:
typedef S *SPtr; // error unless S is declared earlier
需要在聲明指針別名類型之前就已經知道類型S
(可能是結構)的聲明。
盡管這看似微不足道,但它是pimpl慣用語的常見實現的基石。 請注意,這里沒有真正涉及到typedef
,將struct MyClassImpl*
為指向稍后(但在實際取消引用之前)要確定的未知“事物”的指針類型的聲明很重要:
MyClass.h
#ifndef MY_CLASS
#define MY_CLASS
class MyClass
{
... members ...
private:
struct MyClassImpl * m_pimpl; // note no MyClassImpl yet known
};
#endif
MyClass.cpp
#include "MyClass.h"
// implementation formal declaration and implementation.
struct MyClassImpl
{
... members...
};
// MyClass implementation using the now-known MyClassImpl
該指針是否聲明為:
MyClassImpl * m_pimpl;
MyClassImpl
類型需要事先聲明,否則會發生編譯時錯誤。
我希望這有助於確定兩種聲明方法之間的關鍵區別。 (是的,我知道,我應該使用智能指針= P)
祝你好運。
真正的答案也許是 。 這取決於之前找到的其他代碼。
話雖這么說,您可以完全更改此:
typedef struct __GLsync *GLsync;
對此:
struct __GLsync;
typedef __GLsync *GLsync;
如果要從typedef
刪除struct
關鍵字,則必須執行以下操作:
typedef struct S { ... }__GLsync; // S defined in the class name space
那么您可以使用:
typedef __GLsync *GLsync;
附加問題:
如果struct
已經由其他人定義,那么如何解決
typedef struct __GLsync *abc;
typdef *abc GLsync
你可以做這樣的事情
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.