使用C11编译时,POSIX sigevent无法编译

3

我有一个简单的C应用程序,它使用POSIX结构体sigevent。

#include <signal.h>

int main(int argc, char *argv[])
{
    struct sigevent sig_event;

    return 0;
}

当我这样编译它时:
gcc test.c

没问题。但是当我强制使用C11模式时,它会失败:

gcc test.c --std=c11

test.c: In function ‘main’:
test.c:5:21: error: storage size of ‘sig_event’ isn’t known
    struct sigevent sig_event;

我在Ubuntu 15.10上使用gcc 5.2.1。有什么想法是什么原因导致这些错误?当我尝试编译timer_create()函数手册中的示例时,首次出现了此问题。情况相同,只是错误更多。


归根结底,编译器不允许在标准头文件中转储非标准标识符。当编译严格的标准C时,无论是C11还是早期标准,gcc都会停止在标准头文件中转储各种垃圾信息。 - Lundin
2个回答

4

头文件<signal.h>是标准C的一部分。但POSIX增加了更多内容。由于struct sigevent不是C语言的一部分,而是在POSIX中定义的,因此-std=c11会禁用它(可能是某个ifdef)。

gcc test.c

这能够正常工作是因为gcc默认启用了一定级别的POSIX函数以及许多GNU扩展。

使用以下命令进行编译:

gcc -std=c11 -D_POSIX_C_SOURCE=200809 file.c

我本来想说,添加-D_POSIX_C_SOURCE=199309可以清除错误,但我不知道为什么。你的回答解释了这一点。谢谢。 - eclipse
1
使用-std=gnu11而不是-std=c11也可以解决问题。 - Jens Gustedt

0

这是因为posix符号不是C标准的一部分。可以通过多种方式解决此问题,

  • gcc -std=c11 -D_XOPEN_SOURCE=700 file.c
  • gcc -std=c11 -D_GNU_SOURCE file.c
  • gcc -std=gnu11 file.c

这里的700表示X Open7 Posix 2008。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接