我的代码有问题,这是来自迷宫程序的头文件(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
答案 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 ++中的struct
和class
之间没有其他区别。
答案 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
被用来创建一种引用给定结构的简写方式。
因此,在此示例中,StackDataType
和position
都是对正式声明为struct d
的内容的简写引用,Stack
是对正式声明的内容的简写引用为struct STACK
。
一般来说,这允许更清晰的代码引用这些结构。例如,而不是写:
struct STACK var;
声明这个结构的实例,你可以使用:
Stack var;
您可以在声明类型的同一位置声明typedef(如第一个示例中所示),也可以稍后声明(如第二个)。