Nous sommes en train d'attraper des erreurs de compilateur lorsque vous utilisez sigemptyset
sur Cygwin sous Newlib. L'erreur se produit avec un compilateur C++, mais seulement lorsque -std=XXX
est utilisé. Sans une option standard, le programme de test compile et s'exécute comme prévu.Erreur "sigemptyset n'a pas été déclaré dans cette portée" lors de l'utilisation de C + 11 et Newlib
Le programme de test est ci-dessous, et l'en-tête Cygwin d'intérêt suit. Je ne vois rien de suspect dans l'en-tête de Cygwin. J'ai essayé des astuces comme #define _GNU_SOURCE
et #define _XOPEN_SOURCE 700
. J'ai également essayé des trucs comme utiliser les espaces de noms globaux et std
. En relation, voir What does -D_XOPEN_SOURCE do/mean? et Namespace issues in c++11?.
Qu'est-ce qui cause l'échec de la compilation et comment le réparer?
$ cat ~/test.cxx
#include <signal.h>
int main(int argc, char* argv[])
{
struct sigaction new_handler;
return sigemptyset(&new_handler.sa_mask);
}
Sans -std=XXX
, il en résulte:
$ g++ -c test.cxx
$
Avec un -std=XXX
, il en résulte:
$ 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);
Et en essayant d'utiliser sigemptyset
dans l'espace de noms global :
$ 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.
Mes * estimations *? Lorsque vous utilisez un standard C++ sans extensions GNU, vous devez définir '_XOPEN_SOURCE' avant d'inclure' '. –
En outre, vous devriez regarder '' pour le fichier d'en-tête du signal Cygwin. –
Merci @Joachim. Lors de l'exécution de 'sigemptyset' il y a deux hits: (1)'/usr/include/bash/sig.h' et (2) '/ usr/include/sys/signal.h'. – jww