c

时间:2018-09-19 18:12:06

标签: c

在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无法正常工作。我可以提供源代码。

1 个答案:

答案 0 :(得分:2)

在C(和C ++)中,#include是一种非常原始的机制,它只是在实际编译之前对包含的文件中的文本进行“复制粘贴”。

因此,这里发生的是,您使用int*指针编译了 SequenceStack.c 。函数中的代码使用该类型。

然后,传递与之不匹配的这些函数参数。因此,难怪事情不正常。

如果要使用带有指针的“通用”堆栈,建议您使用void*指针指向 SequenceStack 中的元素。根据您的完整代码,例如您需要复制/重新分配元素,您可能必须将元素的大小添加到SqStack