我正在尝试使用C++20指定初始化程序初始化sigaction.h
中的struct sigaction
,但是出现了编译器错误。由于这是一个较大程序的一部分,因此我创建了一个简短的示例:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void onSIGINT(int signal, siginfo_t *siginfo, void *context) {
printf("Caught signal\n");
}
int main(int argc, char** argv) {
struct sigaction act = {
.sa_sigaction = onSIGINT,
.sa_flags = SA_SIGINFO
};
if(sigaction(SIGINT, &act, nullptr) != 0) {
fprintf(stderr, "Failed to listen for SIGINT\n");
return 1;
}
printf("Waiting for signal...\n");
pause();
printf("Exit\n");
return 0;
}
根据https://gcc.gnu.org/projects/cxx-status.html#cxx20,在gcc8中可用指定初始化器。 使用
-std=c++2a
运行Debian buster上的g++(v8.3.0)会出现以下错误:main.cpp: In function ‘int main(int, char**)’:
main.cpp:11:9: error: expected primary-expression before ‘.’ token
.sa_sigaction = onSIGINT,
^
main.cpp:12:9: error: either all initializer clauses should be designated or none of them should be
.sa_flags = SA_SIGINFO
^
只初始化sa_flags
可以成功编译,只初始化sa_sigaction
会导致编译失败(只有第一个错误)。
我还尝试直接初始化__sigaction_handler
(不使用定义来访问联合成员):
struct sigaction act = {
.__sigaction_handler = { .sa_sigaction = onSIGINT },
.sa_flags = SA_SIGINFO
};
这会产生类似的错误:
main.cpp: In function ‘int main(int, char**)’:
main.cpp:12:34: error: expected primary-expression before ‘.’ token
.__sigaction_handler = { .sa_sigaction = onSIGINT },
^
我想我在结构体内部的联合方面做错了什么,但我无法弄清楚是什么。
我知道我可以通过将结构体的内存清零,然后设置回调和标志来实现大致相同的功能,但这不是重点。
gcc --version
。 - KaiserKatze