c-如何定义已定义的标识符?
有一个头文件c-如何定义已定义的标识符?,c,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
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
来代替char
,可以吗?我该怎么做?(我不想修改原始头文件)好吧,既然您正在编译代码,那么没有什么可以阻止您编辑源文件本身,或者使用不同的源文件(您所显示的源文件的稍微修改的副本)将基础类型更改为int
。换句话说,将第一行更改为:
typedef int ElemType;
你需要小心,因为这可能会打破其他地方的假设,但这将是我尝试的第一件事
如编辑中所述,如果您不想修改原始头文件,则可以将其包括在内:
#define char int
#include "stack.h"
#undef char
这可能是因为char
仅在typedef
本身的头文件中使用,因此效果是局部的
请记住,当前构建中的所有翻译单元都应该使用该技巧,否则可能会出现一些非常不寻常的bug
在我看来,最好是将整个堆栈实现分叉,以保持干净,或者使堆栈能够处理任何数据类型(稍微复杂一点,但可行)。好吧,既然您正在编译代码,没有什么可以阻止您编辑源文件本身,或者使用不同的源文件(您所显示的一个稍微修改过的副本),将基础类型更改为
int
。换句话说,将第一行更改为:
typedef int ElemType;
你需要小心,因为这可能会打破其他地方的假设,但这将是我尝试的第一件事
如编辑中所述,如果您不想修改原始头文件,则可以将其包括在内:
#define char int
#include "stack.h"
#undef char
这可能是因为char
仅在typedef
本身的头文件中使用,因此效果是局部的
请记住,当前构建中的所有翻译单元都应该使用该技巧,否则可能会出现一些非常不寻常的bug
在我看来,您最好对整个堆栈实现进行分叉,以尝试保持干净,或者使堆栈能够处理任何数据类型(稍微复杂一点,但可行)。不幸的是,没有太多事情要做。您可以重构代码,使类型a
#define
,因此在头文件中类似这样:
#ifndef ELEMTYPE
# define ELEMTYPE char
#endif
typedef ELEMTYPE ElemType;
然后在源文件中包含头文件之前,您可以执行以下操作
#define ELEMTYPE int
但是,如果从多个文件中使用,并且您在所有源文件中没有相同的
ELEMTYPE
,则这可能是非常危险的。不幸的是,没有太多事情要做。您可以重构代码,使类型a#定义
,因此在头文件中类似这样:
#ifndef ELEMTYPE
# define ELEMTYPE char
#endif
typedef ELEMTYPE ElemType;
然后在源文件中包含头文件之前,您可以执行以下操作
#define ELEMTYPE int
但是,如果从多个文件中使用,并且在所有源文件中没有相同的
ELEMTYPE
,则这可能是危险的。您不能。
在C++中,另一种方法是在不同的命名空间中声明这些标识符。
在C语言中,您可以定义它们,然后在必要时取消它们的定义以创建新的定义。您不能。 在C++中,另一种方法是在不同的命名空间中声明这些标识符。
在C语言中,您可以定义它们,然后在必要时取消它们的定义,以创建一个新的定义。更改第一个typedef…虽然答案以
#define char int
开头,但不,这太邪恶了。@Anton,这也是我的第一个想法,但很可能会打破所有的轨道:-)更改第一个Type……虽然从“代码> >开始定义一个char int < /C>”,但不,它太邪恶了。“Anton,这是我的第一个想法,但是它可能会打破所有的东西:”在C++中,解决方案更像是我想的模板。谢谢,我应该试试CPP。C++是一种非常不同的语言,它有自己的陡峭的学习曲线。在C++中,解决方案更像是我想的模板。谢谢,我应该试试CPP。@ CDT,C++是一种非常不同的语言,它有自己的陡峭的学习曲线。但是Irc<代码>定义< /代码>保留的单词在技术上是不明确的,即使它对大多数实现都有效。我尝试了define char int
方法,但在编译编译器时生成了很多错误信息,我不理解这些信息。@CDT,那么我强烈建议对代码进行分叉,以获得int
版本。这可能是最少的麻烦了。@paxdiablo谢谢,我想我最好试试cpp的模板而不是c。您的建议是适用的,但似乎有点棘手。但是IIRCdefine
'ing保留字在技术上是未定义的,即使它适用于大多数实现。我尝试了define char int
方法,但在编译编译器时生成了大量错误信息,我不理解。@CDT,然后我强烈建议将代码分叉,以获得int
版本。这可能是最少的麻烦了。@paxdiablo谢谢,我想我最好试试cpp的模板而不是c。你的建议是可行的,但似乎有点棘手。我喜欢重构的想法,+1。谢谢,这似乎有点棘手。两个“elemtype”有点混乱,我想我应该试试cpp。我喜欢重构的想法,+1。谢谢,这看起来有点棘手。两个“elemtype”有点混乱,我想我应该试试cpp。