gpt4 book ai didi

c - 为什么 K&R `NUMBER` 中的 "Reverse Polish Calculator"在 gdb 中显示为无效?

转载 作者:太空宇宙 更新时间:2023-11-04 10:03:04 24 4
gpt4 key购买 nike

根据 K&R,反向​​波兰计算器,减少了主要功能,以便更好地理解:

#include <stdio.h>
#include <stdlib.h>
#define NUMBER '0'
#define MAXOP 5

void push(double);
int pop(void);
int getop(char []);

int main(){
int type;
char s[MAXOP];
double op2;
while ((type=getop(s))!=EOF){
switch(type):
case NUMBER:
push(atof(s));
printf("\t%s\n",s);
}

}



#define MAXVAL 100

char val[MAXVAL];
int sp;

void push(double f){
if (sp<MAXVAL)
val[sp++]=f;
}

int pop(void){
if (sp>0)
return val[--sp];
}

#include <ctype.h>

int getch(void);
void ungetch(int);

int getop(char s[]){
int i,c;
while (s[0]=c=getch())==' '||c=='\t')
;
s[1]='\0';
if (!isdigit(c)&&c!='.')
return c;
i=0;
if (isdigit(c))
while (isdigit(s[++i]=c=getch()))
;
if (c=='.')
while (isdigit(s[++i]=c=getch()))
;
s[i]='\0';
if (c!=EOF)
ungetch(c);
return NUMBER;
}


#define BUFSIZE 100

char buf[BUFSIZE];
int bufp=0;

int getch(void){
return (bufp>0)?buf[--bufp]:getchar();
}

int ungetch(int c){
if (bufp>=BUFSIZE)
printf("ungetch: too many characters\n");
else
buf[bufp++]=c;
}

我可以看到,MAXOP 5/* max size of operand or operator */ , 被定义为外部变量,使用 #define .我想不通的是,我怎样才能真正跟踪 MAXOP 的值(value)? , 在程序运行的每个阶段,使用 gdb?

在我提供号码后 10getchar() ,调试时:

14                      while ((type=getop(s))!=EOF){
(gdb) n

Breakpoint 14, getop (s=0x7efff5dc "\n") at t.c:47
47 while ((s[0]=c=getch())==' '||c=='\t')
(gdb) p c
$22 = 10
(gdb) n

Breakpoint 31, getch () at t.c:72
72 return (bufp>0)?buf[--bufp]:getchar();
(gdb) n
10

Breakpoint 34, getch () at t.c:73
73 }
(gdb) n

在某个时刻,当到达 getop 的末尾时功能:

Breakpoint 30, getop (s=0x7efff5dc "10") at t.c:62
62 return NUMBER;
(gdb) p number
No symbol "number" in current context.
(gdb) p (NUMBER)
No symbol "NUMBER" in current context.
(gdb) p $NUMBER
$39 = void
(gdb) n
63 }
(gdb) n

Breakpoint 2, main () at t.c:15
15 switch(type){
(gdb) p type
$40 = 48
(gdb) p NUMBER
No symbol "NUMBER" in current context.
(gdb) p /s NUMBER
No symbol "NUMBER" in current context.
(gdb) p /d $NUMBER
$41 = Value can't be converted to integer.
(gdb) p $NUMBER
$42 = void

问题:

  1. 可以NUMBER的值吗?上述程序编译后,从linux的shell中访问,并运行?换句话说,预处理指令 #define NUMBER '0'创建外部变量 NUMBER这是否与 Linux 上的变量 $PATH 相同?

  2. 为什么 p $NUMBER命令显示 void外部变量的值 NUMBER ?

  3. 为什么 p NUMBER命令显示 No symbol "NUMBER" in current context. ?这是否意味着 gdb 的外部变量被阻止?

最佳答案

Can the value of NUMBER be accessed from the shell of linux, after the above program has been compiled, and run? In other words, does the preprocessing directive #define NUMBER '0' creates the external variable NUMBER that is the same as, for instance, variable $PATH on Linux?

不,幸运的是,当您执行程序时,预处理器符号和 C 符号没有映射到 shell 变量中。

Why does the p $NUMBER command is showing void value for the external variable NUMBER?

Why does the p NUMBER command show No symbol "NUMBER" in current context.? Does it mean, that the external variable is blocked for gdb?

NUMBER 是预处理器符号,它在预处理阶段消失,因为它被它的值替换,编译器本身在它编译的源代码中看不到该符号,所以它不能把调试数据中有关它的信息(例如 标签),因此对于调试器而言是未知的

因此 p $NUMBER 等同于 p $KQHJDSFKJQHKJSDHKJHQSJHDKJHQKJHDSJHSQD 和值 void

p NUMBER 等价于 p KQHJDSFKJQHKJSDHKJHQSJHDKJHQKJHDSJHSQD 表示该符号不存在


如果我只是在将您的 #include 放入评论后进行预处理阶段(不从中获取数千行):

/tmp % gcc -E c.c
# 1 "c.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "c.c"





void push(double);
int pop(void);
int getop(char []);

int main(){
int type;
char s[5];
double op2;
while ((type=getop(s))!=EOF){
switch(type):
case '0':
push(atof(s));
printf("\t%s\n",s);
}

}





char val[100];
int sp;

void push(double f){
if (sp<100)
val[sp++]=f;
}

int pop(void){
if (sp>0)
return val[--sp];
}



int getch(void);
void ungetch(int);

int getop(char s[]){
int i,c;
while (s[0]=c=getch())==' '||c=='\t')
;
s[1]='\0';
if (!isdigit(c)&&c!='.')
return c;
i=0;
if (isdigit(c))
while (isdigit(s[++i]=c=getch()))
;
if (c=='.')
while (isdigit(s[++i]=c=getch()))
;
s[i]='\0';
if (c!=EOF)
ungetch(c);
return '0';
}




char buf[100];
int bufp=0;

int getch(void){
return (bufp>0)?buf[--bufp]:getchar();
}

int ungetch(int c){
if (bufp>=100)
printf("ungetch: too many characters\n");
else
buf[bufp++]=c;
}
/tmp %

如您所见,NUMBER、MAXOP、MAXVALBUFSIZE 已替换为它们的值

关于c - 为什么 K&R `NUMBER` 中的 "Reverse Polish Calculator"在 gdb 中显示为无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54573390/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com