我正在看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
关键字并且没有关键字时会有什么不同?
答案 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
你可以做这样的事情