我需要创建一个像堆栈一样的程序。 我正确地完成了所有功能。 问题是我在两个文件中有两个结构但是当我试图将指针放到另一个结构时它不会让我。
第一个结构在文件“linkedList.h”中声明:
#ifndef _LINKEDLIST_H
#define _LINKEDLIST_H
#include "stack.h"
struct elements{
int element;
elements* pNext;
};
typedef struct elements elements;
void push(myStack *s, int element); // insert element to top of the stack
int pop(myStack *s); //remove element from top of the stack
#endif
第二个结构在第二个文件“stack.h”中声明:
#ifndef _MYSTACK_H
#define _MYSTACK_H
#include "linkedList.h"
struct myStack{
int maxSize;
int count;
bool empty;
elements* firstElement; //the problem is in this line*********************
};
typedef struct myStack myStack;
void initStack(myStack *s, int size);
void cleanStack(myStack *s);
bool isEmpty(myStack *s);
bool isFull(myStack *s);
#endif
但是当我尝试编译它时,它给了我这个错误:
错误再次指向这行代码:
elements* firstElement;
如何解决此问题?
答案 0 :(得分:2)
linkedList.h包含stack.h,stack.h包含linkedlists.h ....你不能这样做。然后,您的#ifndef _LINKEDLIST_H
/ #define _LINKEDLIST_H
最终未定义元素......
您需要使用前向声明来删除循环依赖关系,如下所示。
通过以下方式更改linkedlist.h;
#ifndef _LINKEDLIST_H
#define _LINKEDLIST_H
//#include "stack.h"
struct myStack;
struct elements{
int element;
elements* pNext;
};
typedef struct elements elements;
void push(myStack *s, int element); // insert element to top of the stack
int pop(myStack *s); //remove element from top of the stack
#endif
您还可以创建包含所有函数定义的第三个文件,实际上有很多方法可以解决这个问题。
答案 1 :(得分:0)
如果使用C预处理器处理包含以下行的文件:
#include "stack.h"
#include "linkedList.h"
你会看到为什么#include
来自“linkedList.h”的“stack.h”,反之亦然,以获得定义很麻烦。
我试过
cpp test.cc
test.cc的内容:
#include "stack.h"
#include "linkedList.h"
这就是我得到的:
# 1 "test.cc"
# 1 "<command-line>"
# 1 "test.cc"
# 1 "stack.h" 1
# 1 "linkedList.h" 1
# 1 "stack.h" 1
# 4 "linkedList.h" 2
struct elements{
int element;
elements* pNext;
};
typedef struct elements elements;
void push(myStack *s, int element);
int pop(myStack *s);
# 4 "stack.h" 2
struct myStack{
int maxSize;
int count;
bool empty;
elements* firstElement;
};
typedef struct myStack myStack;
void initStack(myStack *s, int size);
void cleanStack(myStack *s);
bool isEmpty(myStack *s);
bool isFull(myStack *s);
# 2 "test.cc" 2
从预处理器的输出中可以看出,myStack
未在该行之前声明:
void push(myStack *s, int element);
这解释了如果您尝试编译test.cc
,编译器将报告错误的原因。
如果切换test.cc
中的行,您将获得不同的输出。这将导致element
在其声明可用之前被使用。
解决这个问题的方法:
#include
“stack.h”或“stack.h”中的“linkedList.h”更新的文件:
linkedList.h:
#ifndef _LINKEDLIST_H
#define _LINKEDLIST_H
struct elements{
int element;
elements* pNext;
};
typedef struct elements elements;
struct myStack; // Use forward declaration of myStack.
void push(myStack *s, int element); // insert element to top of the stack
int pop(myStack *s); //remove element from top of the stack
#endif
stack.h:
#ifndef _MYSTACK_H
#define _MYSTACK_H
struct elements; // Use forward declaration of elements.
struct myStack{
int maxSize;
int count;
bool empty;
elements* firstElement;
};
typedef struct myStack myStack;
void initStack(myStack *s, int size);
void cleanStack(myStack *s);
bool isEmpty(myStack *s);
bool isFull(myStack *s);
#endif
更新,以回应OP的评论
在#include
的定义之后,您可以在{linkedList.h“中elements
”stack.h“并确保只在编译单元中#include
”linkedList.h“ 。如果在#include
“linkedList.h”之前#include
只是“stack.h”或#include
“stack.h”,则会遇到编译错误。
以下是没有正向声明的更新文件,可以正常工作。
stack.h:
#ifndef _MYSTACK_H
#define _MYSTACK_H
struct myStack{
int maxSize;
int count;
bool empty;
elements* firstElement;
};
typedef struct myStack myStack;
void initStack(myStack *s, int size);
void cleanStack(myStack *s);
bool isEmpty(myStack *s);
bool isFull(myStack *s);
#endif
linkedList.h:
#ifndef _LINKEDLIST_H
#define _LINKEDLIST_H
struct elements{
int element;
elements* pNext;
};
typedef struct elements elements;
// myStack can see the definition of elements
#include "stack.h" // Now myStack available for use
void push(myStack *s, int element); // insert element to top of the stack
int pop(myStack *s); //remove element from top of the stack
#endif
test.cc:
#include "linkedList.h"
但是,如果您使用:
test.cc:
#include "stack.h"
你会遇到编译错误。