Chúng tôi đang gặp lỗi trình biên dịch khi sử dụng sigemptyset
trên Cygwin trong Newlib. Lỗi xảy ra với trình biên dịch C++, nhưng chỉ khi sử dụng -std=XXX
. Không có tùy chọn chuẩn, chương trình thử nghiệm sẽ biên dịch và thực thi như mong đợi.Lỗi "sigemptyset không được khai báo trong phạm vi này" khi sử dụng C + 11 và Newlib
Chương trình thử nghiệm bên dưới và tiêu đề yêu thích của Cygwin theo sau. Tôi không thấy bất cứ điều gì đáng ngờ trong tiêu đề Cygwin.
Tôi đã thử các thủ thuật như #define _GNU_SOURCE
và #define _XOPEN_SOURCE 700
. Tôi cũng đã thử các thủ thuật như sử dụng các không gian tên toàn cầu và std
. Liên quan, xem What does -D_XOPEN_SOURCE do/mean? và Namespace issues in c++11?.
Điều gì gây ra lỗi biên dịch và cách khắc phục sự cố?
$ cat ~/test.cxx
#include <signal.h>
int main(int argc, char* argv[])
{
struct sigaction new_handler;
return sigemptyset(&new_handler.sa_mask);
}
Nếu không có một -std=XXX
, nó kết quả trong:
$ g++ -c test.cxx
$
Với -std=XXX
, nó kết quả trong:
$ 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);
Và khi cố gắng sử dụng sigemptyset
trong không gian tên toàn cầu :
$ 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.
* đoán * của tôi? Khi bạn sử dụng tiêu chuẩn C++ đơn giản không có phần mở rộng GNU, bạn cần xác định '_XOPEN_SOURCE' trước khi bao gồm' '. –
Ngoài ra, bạn nên tìm trong '' cho tệp tiêu đề tín hiệu Cygwin. –
Cảm ơn @Joachim. Khi grepping cho 'sigemptyset' có hai lần truy cập: (1)'/usr/include/bash/sig.h' và (2) '/ usr/include/sys/signal.h'. – jww