在 Newlib 下的 Cygwin 上使用 sigemptyset
时,我们会捕获编译器错误。该错误发生在 C++ 编译器中,但仅在使用 -std=XXX
时才会发生。如果没有标准选项,测试程序将按预期编译和执行。
下面是测试程序,后面是感兴趣的 Cygwin 头文件。我在 Cygwin header 中没有看到任何可疑的内容。
我尝试过像 #define _GNU_SOURCE
和 #define _XOPEN_SOURCE 700
这样的技巧。我还尝试过使用全局和 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);
^
最佳答案
该函数是对 ISO C 标准的扩展。
http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigemptyset.html
因此在 /usr/include/sys/signal.h
上受到
的保护
__XSI_VISIBLE >= 4
有关详细信息,请参阅 /usr/include/sys/features.h
。
默认使用最大的定义集,但是 -std=XXX
减少了定义范围
关于c++ - 使用 C+11 和 Newlib 时出现错误 "sigemptyset was not declared in this scope",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39845030/