c++ - 使用 C+11 和 Newlib 时出现错误 "sigemptyset was not declared in this scope"

标签 c++ c++11 cygwin signals newlib

在 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);
            ^

Things get worse when using -std=gnu++03 and friends .

最佳答案

该函数是对 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/

相关文章:

c++ - 设置几个模板参数的值

c++ - 在 std::for_each 中返回 std::move(f)

git - 使用 Cygwin 或 msysGit 版本的 Git,或同时使用两者?

c++ - 如何在 Cygwin 文件结构中正确放置非默认 C++ 包

java - XBee S1 通信问题

c++ - 以可变类模板作为函数调用参数的函数模板参数推导

c++ - vector 中嵌套 vector 的分段故障核心转储

java - 我如何告诉编译器没有更多的输入

c++ - QVTKWidget中的renderWindowInteractor

c++ - 如何正确散列自定义结构?