【发布时间】:2016-10-04 05:52:40
【问题描述】:
在 Newlib 下的 Cygwin 上使用 sigemptyset 时,我们发现编译器错误。错误发生在 C++ 编译器中,但仅在使用 -std=XXX 时发生。如果没有标准选项,测试程序将按预期编译和执行。
测试程序如下,感兴趣的 Cygwin 头文件如下。我在 Cygwin 标头中没有看到任何可疑之处。
我尝试过#define _GNU_SOURCE 和#define _XOPEN_SOURCE 700 之类的技巧。我还尝试过使用 global 和 std 命名空间等技巧。相关,请参阅What does -D_XOPEN_SOURCE do/mean? 和Namespace issues in c++11?。
是什么导致编译失败,我该如何解决?
$ cat ~/test.cxx
#include <signal.h>
int main(int argc, char* argv[])
{
struct sigaction new_handler;
return sigemptyset(&new_handler.sa_mask);
}
没有-std=XXX,会导致:
$ g++ -c test.cxx
$
使用-std=XXX,结果:
$ g++ -std=c++03 -c test.cxx
test.cxx: In function int main(int, char**):
test.cxx:6:44: error: sigemptyset was not declared in this scope
return sigemptyset(&new_handler.sa_mask);
当尝试在全局命名空间中使用sigemptyset 时:
$ g++ -std=c++03 -c test.cxx
test.cxx: In function ‘int main(int, char**)’:
test.cxx:6:12: error: ‘::sigemptyset’ has not been declared
return ::sigemptyset(&new_handler.sa_mask);
^
【问题讨论】:
-
我的猜?当您使用没有 GNU 扩展的普通 C++ 标准时,您需要在包含
<signal.h>之前定义_XOPEN_SOURCE。 -
另外,您应该在
<cygwin/signal.h>中查找 Cygwin 信号头文件。 -
谢谢@Joachim。当 grep 为
sigemptyset时,有两个命中:(1)/usr/include/bash/sig.h和 (2)/usr/include/sys/signal.h。 -
我没有告诉你直接包含
<cygwin/signal.h>,而是你需要查看Cygwin特定内容的文件。例如,在包含<signal.h>之前需要定义哪些宏。
标签: c++ c++11 cygwin signals newlib