C++typedef中的struct关键字

struct keyword in C++ typedef

本文关键字:关键字 struct 中的 C++typedef      更新时间:2023-10-16

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

不需要CCD_ 4在同一翻译单元中是什么的先验知识。它假定某个结构S的前向声明,并将SPtr别名为指向该结构的指针类型。然而,这:

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

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

虽然这看起来微不足道,但它是皮条习惯用法常见实现的基石。注意,这里并没有真正涉及typedefstruct 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;

类型CCD_ 10将需要预先声明,否则将产生编译时错误。

我希望这有助于确定两种申报方法之间的一个关键区别。(是的,我知道,我应该用一个智能指针=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

您可以执行类似的操作