2009-07-05 186 views
15

在C++中,它可以创建一个结构:用途结构,typedef结构,在C++的

struct MyStruct 
{ 
    ... 
} 

而且还可以做到以下几点:

typedef struct 
{ 
    ... 
} MyStruct; 

然而,据我可以说,两者之间没有明显的区别。哪个更好?为什么两种方式都存在,如果没有区别?在风格或可读性方面比其他人更好吗?

+2

这是http://stackoverflow.com/questions/612328/difference-between的副本-struct-and-typedef-struct-in-c,但我不打算投票结束,因为这个问题的接受答案是(微妙)错误的,正如在第二次投票答案中所解释的那样... – 2009-07-05 12:27:24

回答

12

的typedef的版本是

typedef foo bar; 

其中定义了一个新的“类型”栏中作为foo的别名的特殊情况。在你的情况下,foo碰巧是一个结构。在C语言中,这是引入新“类型”的唯一方法(在引号中,因为它们并不等同于int,float和co)。在C++中,这不是很有用,因为C++被设计为使得新类型的定义比C更容易和更完整(至少在C++的开头),并且typedef甚至不必引用先前声明的结构(或类)。

2

您将使用typedef,因此在声明该结构体的变量时不需要指定struct关键字。

没有的typedef:

struct MyStruct foo; 

用typedef:

MyStruct foo; 

基本上你正在MYSTRUCT出现一个新的类型,因此它也实现了某种抽象级别的程序员不需要知道明确它是什么类型。您可以将MyStruct传递给一个函数,处理它中的数据并返回它,程序员不需要担心实际发生的事情。

很多C标准库都使用typedef。

+0

so its只是少打字? – darkrain 2009-07-05 12:17:32

+5

不需要C++中的'struct'关键字,只有C – 2009-07-05 12:17:53

+0

对不起,总是在C程序员涉及C++问题时发生:(但是你在我完成编辑之前就已经找到了答案:)在这个中 – Cromulent 2009-07-05 12:19:42

7

后者与C兼容 - 在新的C++代码中使用第一个。

0

“struct MyStruct {};”构造隐含地定义了等效的typedef,因此通常这将是现代用法的首选。 typedef仍然有一些用途,主要是指向结构的指针类型。例如。

typedef struct MyStruct* MyStructPtr; 
22

这里有两个声明/定义之间的差异:


1)不能使用typedef名称来标识构造函数或析构函数

struct MyStruct { MyStruct(); ~MyStruct(); }; // ok 

typedef struct { MyStructTD(); ~MyStructTD(); } MyStructTD; // not ok 

// now consider 
typedef struct MyStruct2 { MyStruct2(); } MyStructTD2; // ok 

MyStructTD2::MyStruct2() { } // ok 
MyStructTD2::MyStructTD2() { } // not ok 

2)你不能像你一样隐藏typedef名字名称通过类头引入 - 或者相反,如果您已经有一个具有特定名称的函数或对象,则仍然可以使用类头来声明具有该名称的类,但不能通过typedef方法声明该类。

struct MyStruct { }; // ok 

typedef struct { } MyStructTD; // ok 

void MyStruct() { } // (1) - ok Hides struct MyStruct 
void MyStructTD() { } // (2) - not-ok - ill-formed 

//> Or if you flip it around, consider in a new translation unit: 

void MyStruct() { } // ok 
void MyStructTD() { } // ok 

struct MyStruct { }; // ok 
typedef struct { } MyStructTD; // Not ok 

3)不能在一个详细类型说明符

struct MyStruct { }; // ok 

typedef struct { } MyStructTD; // ok 

int main() 
{ 
    void MyStruct(); 
    void MyStructTD(); // ok - new declarative region 

    struct MyStruct ms; // ok - names the type 
    struct MyStructTD ms2; // not ok - cannot use typedef-name here 

} 

struct AnotherStruct 
{ 
    friend struct MyStruct; // ok 
    friend struct MyStructTD; // not ok 
}; 

4)不能使用它来定义嵌套使用typedef名结构

struct S { struct M; }; 

typedef struct { } S::M; // not ok 

struct S::M { }; // ok 

正如您所看到的,两者之间存在明显的差异。一些typedef的怪癖是C兼容性的结果(这主要是为什么我认为这两种方式都存在) - 在大多数情况下,在类头中声明名称更自然C++ - 它有它的优势(特别是当你需要定义构造函数和析构函数),因此更可取。如果您正在编写需要兼容C和C++的代码,那么使用这两种方法都有好处。但是如果你正在编写纯粹的C++,我发现在类头中指定类名是更可读的。

1

有很多答案认为这两种方法是等价的,但它们不是。

typedef关键字用于创建一个类型别名,也就是说,它提供了一种引用另一种类型的新方法。当您使用typedef struct {} XXX;时,您实际上正在创建一个未命名类型,然后为该未命名类型创建一个别名XXX。另一方面,当你输入struct XXX {}

请,由迈克尔·伯尔here(这是一个比接受了这个问题一个更好的答案读出了答案。