Ошибка «sigemptyset не была объявлена ​​в этой области» при использовании C + 11 и Newlib

Мы ловим ошибки компилятора при использовании sigemptyset на Cygwin под Newlib. Ошибка происходит с компилятором C ++, но только когда -std=XXX используется. Без стандартного параметра тестовая программа компилируется и выполняется так, как ожидается.

Тестовая программа ниже, а интересующий заголовок Cygwin следует. Я не вижу ничего подозрительного в заголовке Cygwin.

Я пробовал такие трюки, как #define _GNU_SOURCE а также #define _XOPEN_SOURCE 700, Я также попробовал трюки, такие как использование глобального и std Пространства имен. Связанные, см. Что означает / D_XOPEN_SOURCE? а также Проблемы с пространством имен в 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);
^

Вещи ухудшаются при использовании -std=gnu++03 и друзья.

6

Решение

Эта функция является расширением стандарта 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 уменьшает область определения

2

Другие решения

Проблема была проработана в Botan 2.1.0 не компилируется под Cygwin 2.8.0 с g ++ 5.4.0. Вот два комментария, представляющих интерес.

Во-первых, из noloader:

Cygwin использует Newlib, а не GNU libstdc++, Когда нет
-std=c++XXтекущий GCC по умолчанию -std=gnu++11 (GCC 6 изменений
в gnu++14
по умолчанию). я
полагаю, что источники GNU обеспечивают ожидаемые функции, такие как sigaction, являются
имеется в наличии.

Вы можете попробовать -D_XOPEN_SOURCE=600 или же
-D_XOPEN_SOURCE=700,

Также см C ++ и функции защиты
Вопрос
на
Список рассылки Newlib.

Во-вторых, из SideChannel:

Спасибо @noloader. До сих пор -std=c++11 был установлен в Makefile,
важная информация в вышеупомянутой теме на рассылке Newlib
список. Яаков Сельковиц написал:

G ++ определяет _GNU_SOURCE на цели glibc, что означает, что -std=c++NN В отличие от документации, не является строгим стандартом ISO C ++:

Итак, применяя патч № 987
И настройка -std=gnu++11 работает для меня. я
не пробовал другой -D варианты (я думаю, что другой факт больше
фундаментальная). Подводя итог, @randombit, пожалуйста, примените PR # 987 и установите
-std=gnu++11 для gcc под Cygwin.

1

По вопросам рекламы [email protected]