Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c-如何定义已定义的标识符?_C - Fatal编程技术网

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。您的建议是适用的,但似乎有点棘手。但是IIRC
define
'ing保留字在技术上是未定义的,即使它适用于大多数实现。我尝试了
define char int
方法,但在编译编译器时生成了大量错误信息,我不理解。@CDT,然后我强烈建议将代码分叉,以获得
int
版本。这可能是最少的麻烦了。@paxdiablo谢谢,我想我最好试试cpp的模板而不是c。你的建议是可行的,但似乎有点棘手。我喜欢重构的想法,+1。谢谢,这似乎有点棘手。两个“elemtype”有点混乱,我想我应该试试cpp。我喜欢重构的想法,+1。谢谢,这看起来有点棘手。两个“elemtype”有点混乱,我想我应该试试cpp。