C++ 指向c+;中另一个文件的结构内部的结构的指针+;
我需要创建一个类似于堆栈的程序。 我把所有的功能都做对了。 问题是,我在两个文件中有两个结构,但当我试图将指针放在另一个结构上时,它不允许我这样做 第一个结构在文件“linkedList.h”中声明: 第二个结构在第二个文件“stack.h”中声明: 但当我试图编译它时,它会给我以下错误:C++ 指向c+;中另一个文件的结构内部的结构的指针+;,c++,pointers,struct,C++,Pointers,Struct,我需要创建一个类似于堆栈的程序。 我把所有的功能都做对了。 问题是,我在两个文件中有两个结构,但当我试图将指针放在另一个结构上时,它不允许我这样做 第一个结构在文件“linkedList.h”中声明: 第二个结构在第二个文件“stack.h”中声明: 但当我试图编译它时,它会给我以下错误: 错误C2143:语法错误:缺少“;”在“*”之前 错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认INT/LI> 错误再次指向这一行代码: elements* firstElement;
elements* firstElement;
如何修复此问题?linkedList.h包括stack.h和stack.h包括linkedList.h……您不能这样做。然后,您的
#ifndef(链接列表)
/#define(定义)链接列表(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
您还可以创建包含所有函数定义的第三个文件,实际上有很多方法可以解决此问题。如果您使用C预处理器处理具有以下行的文件:
#include "stack.h"
#include "linkedList.h"
您将看到为什么从“linkedList.h”中选择“stack.h”以及从“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
这就解释了如果您试图编译test.cc
,编译器将报告错误的原因
如果在test.cc
中切换行,将获得不同的输出。这将导致元素在其声明可用之前被使用
解决这个问题的方法是:
不要在“linkedList.h”中包含“stack.h”或在“stack.h”中包含“linkedList.h”
在两个文件中使用前向声明以使用类型
更新的文件:
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
#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
#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
堆栈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
#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
更新,回应OP的评论
在定义元素之后,可以#在“linkedList.h”中包含“stack.h”,并确保#仅在编译单元中包含“linkedList.h”。如果您在#include
之前只包含“stack.h”或#include
包含“stack.h”
#include
ing“linkedList.h”,您将遇到编译器错误
以下是没有转发声明的更新文件,它们工作正常
堆栈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
#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
#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
#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
#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"
#include "stack.h"
但是,如果您使用:
test.cc:
#include "linkedList.h"
#include "stack.h"
您将遇到编译器错误。语句,如typedef struct elements代码>在C++中不是必需的。您尝试过<代码>结构元素*FielStEng:;代码>声明所有堆栈操作,包括它们所属的“stack.h”中的push
和pop
。我需要一个不使用前向声明的解决方案。我需要一个不使用前向声明或第三个文件的解决方案。如果没有这些解决方案,恐怕您无法解决问题。除非按照moldbnilo的建议,将push和pop移动到stack.h