siginfo_t尚未声明:由于包含thrift标头而导致

时间:2014-06-13 18:23:11

标签: c++ include thrift c-preprocessor

这是我的main.cpp

#include <thrift/protocol/TProtocol.h>

#define <sys/wait.h>

int main(int argc, char** argv) {
  return 0;
}

当我运行g++ main.cpp时,我得到:

In file included from main.cpp:2:0:
/usr/include/x86_64-linux-gnu/sys/wait.h:148:52: error: ‘siginfo_t’ has not been declared
 extern int waitid (idtype_t __idtype, __id_t __id, siginfo_t *__infop,
                                                    ^

如果我颠倒了包含的顺序,或者如果删除其中任何一个包含,则编译成功。这两者之间有一些互动包括我不明白。在 thrift/protocol/TProtocol.h之前包含<{1}}时,编译才会失败。

我想查看预处理输出的样子,因此我运行sys/wait.h

我明白了:

g++ main.cpp -E -o preprocessed.p; grep -irn -B 10 "siginfo_t" preprocessed.p;

在我看来,在38171-38178行声明/定义了siginfo_t 。为什么这不足以在第39472行使用?

的信息:

  • Ubuntu 14.04
  • Thrift 0.9.1,配置38168- } _sigpoll; 38169- 38170- 38171- struct 38172- { 38173- void *_call_addr; 38174- int _syscall; 38175- unsigned int _arch; 38176- } _sigsys; 38177- } _sifields; 38178: } siginfo_t ; -- 38408-extern int gsignal (int __sig) throw (); 38409- 38410- 38411- 38412- 38413-extern void psignal (int __sig, const char *__s); 38414- 38415- 38416- 38417- 38418:extern void psiginfo (const siginfo_t *__pinfo, const char *__s); -- 38476-# 24 "/usr/include/x86_64-linux-gnu/bits/sigaction.h" 3 4 38477-struct sigaction 38478- { 38479- 38480- 38481- union 38482- { 38483- 38484- __sighandler_t sa_handler; 38485- 38486: void (*sa_sigaction) (int, siginfo_t *, void *); -- 38528- 38529-extern int sigwait (const sigset_t *__restrict __set, int *__restrict __sig) 38530- __attribute__ ((__nonnull__ (1, 2))); 38531- 38532- 38533- 38534- 38535- 38536- 38537-extern int sigwaitinfo (const sigset_t *__restrict __set, 38538: siginfo_t *__restrict __info) __attribute__ ((__nonnull__ (1))); 38539- 38540- 38541- 38542- 38543- 38544- 38545-extern int sigtimedwait (const sigset_t *__restrict __set, 38546: siginfo_t *__restrict __info, -- 39462-extern __pid_t wait (void * __stat_loc); 39463-# 125 "/usr/include/x86_64-linux-gnu/sys/wait.h" 3 4 39464-extern __pid_t waitpid (__pid_t __pid, int *__stat_loc, int __options); 39465-# 135 "/usr/include/x86_64-linux-gnu/sys/wait.h" 3 4 39466-# 1 "/usr/include/x86_64-linux-gnu/bits/siginfo.h" 1 3 4 39467-# 24 "/usr/include/x86_64-linux-gnu/bits/siginfo.h" 3 4 39468-# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4 39469-# 25 "/usr/include/x86_64-linux-gnu/bits/siginfo.h" 2 3 4 39470-# 136 "/usr/include/x86_64-linux-gnu/sys/wait.h" 2 3 4 39471-# 148 "/usr/include/x86_64-linux-gnu/sys/wait.h" 3 4 39472:extern int waitid (idtype_t __idtype, __id_t __id, siginfo_t *__infop,

1 个答案:

答案 0 :(得分:1)

这是一个现已修复的错误:

https://github.com/apache/thrift/commit/f4e6e62ea091b94322ecc99756269dbee1c06380

系统标题(sys/param.h)已包含在 apache::thrift::protocol命名空间内。