Мы ловим ошибки компилятора при использовании sigemptyset
на Cygwin под Newlib. Ошибка возникает с компилятором C++, но только тогда, когда используется -std=XXX
. Без стандартной опции тестовая программа компилируется и выполняется, как ожидалось.Ошибка «sigemptyset не была объявлена в этой области» при использовании C + 11 и Newlib
Ниже приведена тестовая программа, и ниже представлен заголовок Cygwin. Я не вижу ничего подозрительного в заголовке Cygwin.
Я пробовал трюки, такие как #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.
My * guess *? Когда вы используете простой стандарт C++ без расширений GNU, вам нужно определить '_XOPEN_SOURCE', прежде чем включать' '. –
Кроме того, вы должны искать в '' для файла заголовка сигнала Cygwin. –
Спасибо @Joachim. При grepping для 'sigemptyset' есть два обращения: (1)'/usr/include/bash/sig.h' и (2) '/ usr/include/sys/signal.h'. – jww