c中相同结构的不同typedef

c中相同结构的不同typedef,c,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中,我

在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

所以在迷宫里,我有

#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仅影响int ord

如果我将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;
不要把任何东西放在迷宫里。h,一切正常

我想知道出了什么问题以及为什么ifndef不起作用。我可以给出源代码。

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

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

然后传递这些函数参数,这些参数与此不匹配。所以,事情不顺利也就不足为奇了

如果您想要带有指针的“通用”堆栈,我建议您使用指向SequenceStack中元素的
void*
指针。根据您的完整代码,例如您需要复制/重新分配元素,您可能需要在C(和C++)中向
SqStack

添加元素的大小,
#include
是一种非常原始的机制,它只是在实际编译之前对包含文件中的文本进行“复制粘贴”

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

然后传递这些函数参数,这些参数与此不匹配。所以,事情不顺利也就不足为奇了


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

,这闻起来像是ODR冲突之类的。你正在尝试做泛型/模板,C做得不好。不清楚你到底在问什么。。。你期待什么?你得到了什么?“调试器中更改的SqStack只影响int ord。”(可能某处缺少逗号?)?C中唯一的“泛型”类型是指向任何
void*
的指针。也许您可以使用
void*
(并根据需要进行类型转换)来解决问题?根据@Someprogrammerdude所说的,如果您想编写一些适用于不同类型对象的堆栈代码,最好在堆栈中存储
void*
。然后可以创建整数堆栈、结构堆栈等。这是相当危险的,因为没有什么可以阻止您将字符串推到int堆栈上,或将结构推到float堆栈上。但它可以让你重复使用你的堆栈代码。这闻起来像是ODR冲突之类的。你正在尝试做泛型/模板,C做得不好。不清楚你到底在问什么。。。你期待什么?你得到了什么?“调试器中更改的SqStack只影响int ord。”(可能某处缺少逗号?)?C中唯一的“泛型”类型是指向任何
void*
的指针。也许您可以使用
void*
(并根据需要进行类型转换)来解决问题?根据@Someprogrammerdude所说的,如果您想编写一些适用于不同类型对象的堆栈代码,最好在堆栈中存储
void*
。然后可以创建整数堆栈、结构堆栈等。这是相当危险的,因为没有什么可以阻止您将字符串推到int堆栈上,或将结构推到float堆栈上。但是它可以让你重复使用你的堆栈代码,所以我的理解是它忽略了ifndef中的代码,并将其余的粘贴到Maze.h中。但是,当complie StackSe.c时,#ifndef中的代码不会被忽略。是吗?是的,虽然我不会说“忽略”。预处理器在生成实际的源代码并将其输入C编译阶段时,会根据条件保留或删除
#if…#else…#endif
块中的源代码。预印阶段基本上是文本操作,它发生在实际编译阶段之前。编译器有开关来完成预印阶段或生成中间临时文件,这可能有助于解决某些bug。因此我的理解是,它忽略了#ifndef中的代码,并将其余部分粘贴到Maze.h中。但是,当complie StackSe.c时,#ifndef中的代码不会被忽略。是吗?是的,虽然我不会说“忽略”。预处理器在生成实际的源代码并将其输入C编译阶段时,会根据条件保留或删除
#if…#else…#endif
块中的源代码。预印阶段基本上是文本操作,它发生在实际编译阶段之前。编译器有开关,可以只执行预印阶段或生成中间临时文件,这有助于解决某些bug。