C ++ typedef中的struct关键字

时间:2014-09-16 16:26:39

标签: c++ c

我正在看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;

如果没有,那么当typedef使用struct关键字并且没有关键字时会有什么不同?

3 个答案:

答案 0 :(得分:3)

以下形式的typedef:

typedef struct S *SPtr;

不需要事先了解S在同一翻译单元中的含义。它假定某个结构S的前向声明和别名SPtr作为指向同一个的指针类型。但是,这个:

typedef S *SPtr; // error unless S is declared earlier 

要求在声明指针别名类型之前已知类型S(可能是结构)的声明。

虽然这看似微不足道,但它是pimpl idiom的常见实现的基石。请注意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)

祝你好运。

答案 1 :(得分:1)

这里真正的答案是也许。这取决于之前发现的其他代码。

话虽如此,你绝对可以改变这一点:

typedef struct __GLsync *GLsync;

对此:

struct __GLsync;
typedef __GLsync *GLsync;

答案 2 :(得分:0)

如果您要从struct中删除typedef关键字,则必须执行以下操作:

typedef struct S { ... }__GLsync; // S defined in the class name space

然后你可以使用:

typedef  __GLsync  *GLsync;

附加问题:

如果struct已被其他人定义,那么该如何解决

 typedef struct __GLsync  *abc;
 typdef  *abc       GLsync

你可以做这样的事情