在SequenceStack.h中,我有以下代码
#ifndef SEQUENCESTACK_H
#define SEQUENCESTACK_H
#ifndef DATASTRUCTURE_MAZE_H
typedef int SElemType_Sq;
#endif
typedef struct {
SElemType_Sq *base;
SElemType_Sq *top;
int stacksize;
}SqStack;
在SequenceStack.c中,我有
#include "SequenceStack.h"
定义一个堆栈。
在另一个我想使用堆栈但要更改elemtype的程序中。
所以在Maze.h中,我有
#ifndef DATASTRUCTURE_MAZE_H
#define DATASTRUCTURE_MAZE_H
typedef struct {
int x;
int y;
}PosType;
typedef struct {
int ord;
PosType seat;
int di;
}SElemType_Sq;
#include "SequenceStack.h"
仅在调试器中更改的SqStack受到影响。
如果我将SequenceStack.h更改为
#ifndef SEQUENCESTACK_H
#define SEQUENCESTACK_H
typedef struct {
int x;
int y;
}PosType;
typedef struct {
int ord;
PosType seat;
int di;
}SElemType_Sq;
typedef struct {
SElemType_Sq *base;
SElemType_Sq *top;
int stacksize;
}SqStack;
在Maze.h中不放任何东西,一切正常。
我想知道哪里出了问题以及为什么#ifndef无法正常工作。我可以提供源代码。
答案 0 :(得分:2)
在C(和C ++)中,#include
是一种非常原始的机制,它只是在实际编译之前对包含的文件中的文本进行“复制粘贴”。
因此,这里发生的是,您使用int*
指针编译了 SequenceStack.c 。函数中的代码使用该类型。
然后,传递与之不匹配的这些函数参数。因此,难怪事情不正常。
如果要使用带有指针的“通用”堆栈,建议您使用void*
指针指向 SequenceStack 中的元素。根据您的完整代码,例如您需要复制/重新分配元素,您可能必须将元素的大小添加到SqStack
。