#define不传播到C头文件

时间:2013-05-23 00:22:06

标签: c

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

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

我做了必要的更改(REG_EIP - &gt; 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 _sUSE/ucontext.h”中的行“#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

谢谢你, 艾哈迈德。

3 个答案:

答案 0 :(得分:3)

想出来。 ucontext.h包含在signal.h中,由于__USE_GNU未由包含时间定义,因此REG_RIP未定义。在我的C文件中添加#include <ucontext.h>无效。

添加第&#34; #define __USE_GNU&#34;在#include <stdio.h>解决问题之后。

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

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

感谢大家的帮助。

答案 1 :(得分:1)

我怀疑在你的sys/ucontext.h到达之前还有#including #include

头文件(#ifndef _SYS_UCONTEXT_H, #define _SYS_UCONTEXT_H)中的保护可防止头文件被多次#included。如果此文件已经包含在#define __USE_GNU之前,则无效。

如果将#define移到C文件的顶部,是否会编译?

答案 2 :(得分:0)

signal.h包含在主模块的前面(在定义__USE_GNU之前)这是问题吗?

如果将#define移动到主文件的开头怎么办?

另外,关于自己定义__USE_GNU:

_GNU_SOURCE and __USE_GNU