簡體   English   中英

C ++ typedef中的struct關鍵字

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM