Łapiemy błędy kompilatora podczas korzystania z sigemptyset
na Cygwin pod Newlib. Błąd występuje w kompilatorze C++, ale tylko wtedy, gdy użyto -std=XXX
. Bez standardowej opcji program testowy kompiluje się i wykonuje zgodnie z oczekiwaniami.Błąd "nie określono wartości w tym zakresie" podczas korzystania z C + 11 i Newlib
Program testowy znajduje się poniżej, a nagłówek interesujący Cygwin następuje. Nie widzę niczego podejrzanego w nagłówku Cygwin.
Próbowałem sztuczek takich jak #define _GNU_SOURCE
i #define _XOPEN_SOURCE 700
. Próbowałem również sztuczek, takich jak używanie przestrzeni nazw globalnych i std
. Powiązane, zobacz What does -D_XOPEN_SOURCE do/mean? i Namespace issues in c++11?.
Co powoduje awarię kompilacji i jak ją naprawić?
$ cat ~/test.cxx
#include <signal.h>
int main(int argc, char* argv[])
{
struct sigaction new_handler;
return sigemptyset(&new_handler.sa_mask);
}
Bez -std=XXX
, skutkuje:
$ g++ -c test.cxx
$
Z -std=XXX
, skutkuje:
$ 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);
A kiedy próbują wykorzystać sigemptyset
w globalnej przestrzeni nazw :
$ 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.
Moje * zgadnij *? Kiedy używasz zwykłego standardu C++ bez rozszerzeń GNU, musisz zdefiniować '_XOPEN_SOURCE' przed dodaniem' '. –
Powinieneś też szukać w '' dla pliku nagłówkowego sygnału Cygwin. –
Dzięki @ Joachim. Kiedy grepping dla 'sigemptyset' ma dwa trafienia: (1)'/usr/include/bash/sig.h' i (2) '/ usr/include/sys/signal.h'. – jww