我已经多次看到以下样式类的定义。这个样式类的优缺点是什么呢?
typedef class _MyClass
{
public :
_MyClass();
} MyClass;
在C ++中很少见,但在C中很常见(其中struct Foo
不会自动别名为Foo
)。您可能会在具有不同平台的不同类的库中看到它(例如,“Canvas”类,它非常特定于实现)。该库将使用typedef
让其用户简化其代码:
#if WINDOWS
typedef class WindowsCanvas {
private: HWND handle;
} Canvas;
#elif MAC
typedef class MacCanvas {
private: CGContextRef context;
} Canvas;
#endif
Canvas
类型,而不是特定于平台的类型。struct X
{
int x;
};
X a; //compiler error
struct X b; //OK
为了避免在C语言中使用复杂的类型说明符,例如struct X a
或enum E e;
等,通常的做法是对名称进行typedef。例如:
typedef struct X_ { ... } X;
现在 X a;
也可以了。
在C++中,自然不需要这样做。
typedef struct foo foo;
是合法的。而typedef struct _foo foo;
这种写法实际上是为了解决C++中的问题,因为C++对于每个struct
/class
声明都有一个隐式的typedef
,所以typedef
不能与struct
同名。 - asveikau一个可能的优势可以通过一个高度虚构的例子来说明,但由于标准提到了它,它一定有一个含义。
$7.1.3/6- "同样,在给定的范围内,不应该使用与在该范围内声明并指向除该类或枚举本身以外的类型的typedef名称相同的名称声明类或枚举。[
typedef struct S{} MYS;
int MYS; // Error due to $7.1.3/6
struct A{};
int A; // No error, subsequent use required fully elaborated name
int main(){}
_MyClass
是一个被实现(编译器+标准库)保留的标识符。在用户代码中使用它是不正确的。这里有一个相关的问题(链接:https://dev59.com/L3I-5IYBdhLWcg3wxruQ)。该问题被标记为C,第一个答案既适用于C也适用于C++,并解释了两者之间的区别。 - David Rodríguez - dribeas