0

有一个头文件stack.h

typedef char ElemType;

typedef struct{
    ElemType data[MaxSize];
    int top;
} SqStack;

int Push_Sq(SqStack *s, ElemType e);

int Pop_Sq(SqStack *s, ElemType *e);

int GetTop_Sq(SqStack *s, ElemType *e);

现在我有一些源文件,包括这个头文件,我想用intforElemType代替char,这可能吗?我该怎么办?(我不想修改原来的头文件)

4

3 回答 3

2

不幸的是,没什么可做的。您可以重构代码以使类型 a #define,因此在头文件中是这样的:

#ifndef ELEMTYPE
# define ELEMTYPE char
#endif

typedef ELEMTYPE ElemType;

然后在源文件中包含头文件之前可以做

#define ELEMTYPE int

但是,如果从多个文件中使用并且您在所有源文件中都没有相同的文件,这可能会很危险。ELEMTYPE

于 2013-02-02T10:49:42.393 回答
1

好吧,由于您正在编译代码,因此没有什么可以阻止您编辑源文件本身,或使用不同的源文件(您显示的文件的稍微修改的副本)将基础类型更改为int. 换句话说,将第一行更改为:

typedef int ElemType;

您需要小心,因为这可能会破坏其他地方的假设,但这将是我尝试的第一件事。

如果,如编辑中所述,您不想修改原始头文件,则可以将其包含在内:

#define char int
#include "stack.h"
#undef char

这可能char只在该头文件typedef本身中使用,因此效果是本地化的。

请记住,当前构建中的所有翻译单元都应该使用该技巧,否则您最终可能会遇到一些非常不寻常的错误。


在我看来,最好分叉整个堆栈实现以尝试保持干净,或者使堆栈能够处理任何数据类型(稍微复杂一点,但可行)。

于 2013-02-02T10:48:09.977 回答
1

你不能。

在 C++ 中,另一种方法是在不同的命名空间中声明这些标识符。

在 C 语言中,您可以#define 它们,然后在必要时#undef 它们以创建新的#define。

于 2013-02-02T10:55:49.993 回答