c - 如何输入已定义的已定义标识符?

时间:2013-02-02 10:45:38

标签: c

有一个标题文件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);

现在我有一些包含此标题的源文件,我想int使用ElemType代替char,是否可能?我该怎么办?(我不想修改原始头文件)

3 个答案:

答案 0 :(得分:2)

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

#ifndef ELEMTYPE
# define ELEMTYPE char
#endif

typedef ELEMTYPE ElemType;

然后在源文件之前中包含您可以执行的头文件

#define ELEMTYPE int

如果从多个文件中使用,则危险所有源文件中没有相同的ELEMTYPE

答案 1 :(得分:1)

好吧,既然您正在编译代码,那么就没有什么能阻止您编辑源文件本身,或者使用不同的源文件(您已经显示的文件略微修改过的副本)来将基础类型更改为int。换句话说,将第一行更改为:

typedef int ElemType;

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

如果如编辑中所述,您不想修改原始头文件,则可以这样包含它:

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

这可能有效,因为char仅在typedef本身的头文件中使用,因此效果已本地化。

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


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

答案 2 :(得分:1)

你不能。

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

在C语言中你可以#define它们,然后在必要时#undef它们来制作一个新的#define。