gpt4 book ai didi

c - #define 不传播到 C 头文件

转载 作者:行者123 更新时间:2023-12-04 02:55:47 25 4
gpt4 key购买 nike

我正在尝试从以下链接编译代码以在生成信号时打印回溯:

http://www.linuxjournal.com/article/6391?page=0,1(来自文章http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/063/6391/6391l3.html)

我进行了必要的更改(REG_EIP -> REG_RIP)。我还将“#include <ucontext.h>”更改为“#include <sys/ucontext.h>”以调试我将在下面解释的问题。

文件顶部如下:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <execinfo.h>

/* get REG_EIP from ucontext.h */
#define __USE_GNU
#include <sys/ucontext.h>

...

按原样使用代码,出现以下错误:

# gcc ./st2.c -rdynamic  -o st2
./st2.c: In function ‘bt_sighandler’:
./st2.c:22: error: ‘REG_RIP’ undeclared (first use in this function)
./st2.c:22: error: (Each undeclared identifier is reported only once
./st2.c:22: error: for each function it appears in.)

但是,当我将“#define __USE_GNU”行复制到“/usr/include/sys/ucontext.h”的顶部时(我知道这是一个非常糟糕的主意并且只是暂时的)如下:

#ifndef _SYS_UCONTEXT_H                                                            
#define _SYS_UCONTEXT_H 1

#define __USE_GNU
#include <features.h>
#include <signal.h>
#include <bits/wordsize.h>

............

#endif // _SYS_UCONTEXT_H

我的程序可以正确编译和运行。

我很困惑,为什么我程序中的#define 没有“流入”头文件“sys/ucontext.h”,而将#define 直接添加到sys/ucontext.h 中会有所不同。任何帮助将不胜感激。j

谢谢,艾哈迈德。

最佳答案

想通了。 ucontext.h 包含在 signal.h 中,并且由于包含时间未定义 __USE_GNU,因此未定义 REG_RIP。做加法 #include <ucontext.h>在我的 C 文件中没有效果。

#include <stdio.h> 之后添加行“#define __USE_GNU”解决了问题。

#include <stdio.h>
#define __USE_GNU
#include <stdlib.h>
#include <signal.h>
#include <execinfo.h>

在 stdio.h 之前添加 #define 没有帮助,因为 stdio.h 包括 features.h which undef __USE_GNU

感谢大家的帮助。

关于c - #define 不传播到 C 头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16703695/

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