struct定义中的typedef用法

时间:2013-11-10 20:30:47

标签: c++ header typedef

我的代码有问题,这是来自迷宫程序的头文件(stack.h)。我正在研究Stack结构,在我的文档中,我无法理解这些类型的结构,任何人都可以向我解释为什么我们使用typedef以及第12和第21行如何工作?

    #ifndef STACK_H
    #define STACK_H 
    #define STACKSIZE 50 

    typedef struct d {
        int x;
        int y;
        int right; int left;
        int down;
        int up;
        int camefrom;
        } StackDataType, position;           /// LINE 12

    struct STACK{
        StackDataType element[STACKSIZE]; int top;
        void create();
        void close();
        bool push(StackDataType); StackDataType pop();
        bool isempty();
    };
    typedef struct STACK Stack;             /// LINE 21
    #endif

5 个答案:

答案 0 :(得分:1)

我认为你不需要在C ++中再次输入构造结构,它再次定义了一个结构,这是不必要的。你可以定义:

struct d{

};

答案 1 :(得分:1)

在我(相当多)的经验中,这几乎总是表示一个C程序员已经摸不着头脑进入C ++。如果这些是你班级的笔记,那就不太好了。

在最早的“C”中,如果您声明了struct

struct StructName {
    int a;
    int b;
};

这没有声明一个类型名称,它只声明了一个结构名称,所以要创建一个StructName实例,你必须写:

struct StructName myStruct;

如果您想省略“StructName”部分,则需要使用typedef:

struct StructName { int a, b; };
typedef struct StructName StructName;

或者你可以将这些结合成一个有点令人困惑的声明:

typedef struct StructName { int a, b; } StructName;

我说混淆是因为如果struct定义多行很长,可能会混淆第二个C语法,它允许您在定义类型后声明Struct的实例:

struct StructName { int a, b; } StructName;
// aka
struct StructName { int a, b; };
struct StructName StructName; // local variable, StructName of type struct StructName
// declare a VARIABLE called StructName which is of type anonymous-struct.
struct { int a, b; } StructName;

这样做的一个问题是你不能在结构声明中使用typedef'd名称:

// Won't compile because 'List' isn't declared until the end.
typedef struct list_structure { List* next; int a; } List;

// Won't compile because you have to remember to say 'struct List'
typedef struct List { List* next; int a; } List;

// Compiles
typedef struct list_structure { struct list_structure* next; int a; } List;

这让很多C程序员感到困惑。足以让许多C程序员告诉你结构的定义是

typedef struct tag_name { /* struct details */ } structname;
//e.g.
typedef struct tagStructName { int a, b; } StructName;

C ++继承了所有这一切,但也继续为你暗示了typedef:

// doesn't compile as C, will compile as C++
struct List {
    List* next;
    int a;
};

要查看它未编译为C:http://ideone.com/3r9TRy

在C ++中,将某些内容声明为类完全与将其声明为结构相同,只需更改一次:

class List {
    List* next;
public:
    int a;
};

完全就好像你写过:

struct List {
private:
    List* next;
public:
    int a;
};

C ++中的structclass之间没有其他区别。

答案 2 :(得分:0)

我可以看到两个问题:第一个是结构定义中的神秘符号d。第二个是你也使用typedef作为结构,但是在类型名StackDataType之后有一些东西。你得到的第二个错误可能只是因为第一个错误,在C和C ++中由于先前的错误而在不相关的行中出错是很常见的。

此外,在C ++中,您不需要typedef用于结构,因为它们与类如此相同,例如struct StackDataType {...};允许您使用StackDataType作为类型。

答案 3 :(得分:0)

在C ++中,您不需要typedef。事实上现在很奇怪。下面的代码足以创建一个新类型:

struct foo {
     ...
};

过去,您必须明确地键入结构以避免在任何地方使用struct。例如:

typedef struct {
} foo;

// or

struct foo {
};
typedef struct foo foo;

否则您必须在使用struct之前使用foo

struct foo f;

struct foo面对面是一个类型而foo不是(除非您明确地将其作为typedef的类型)


最后,您的代码可以是这样的:

#ifndef STACK_H
#define STACK_H

#define STACKSIZE 50

struct StackDataType
{
    int x;
    int y;
    int right;
    int left;
    int down;
    int up;
    int camefrom;
};

// typedef StackDataType position;

struct Stack
{
    StackDataType element[STACKSIZE];
    int top;
    void create();
    void close();
    bool push(StackDataType);
    StackDataType pop();
    bool isempty();
};

#endif

答案 4 :(得分:0)

正在发生的是,基本上typedef被用来创建一种引用给定结构的简写方式。

因此,在此示例中,StackDataTypeposition都是对正式声明为struct d的内容的简写引用,Stack是对正式声明的内容的简写引用为struct STACK

一般来说,这允许更清晰的代码引用这些结构。例如,而不是写:

struct STACK var;

声明这个结构的实例,你可以使用:

Stack var;

您可以在声明类型的同一位置声明typedef(如第一个示例中所示),也可以稍后声明(如第二个)。