这是我的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行使用?
的信息:
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,
答案 0 :(得分:1)
这是一个现已修复的错误:
https://github.com/apache/thrift/commit/f4e6e62ea091b94322ecc99756269dbee1c06380
系统标题(sys/param.h
)已包含在 apache::thrift::protocol
命名空间内。