【问题标题】:POSIX sigevent not compiling with c11POSIX sigevent 不使用 c11 编译
【发布时间】:2016-01-06 22:39:45
【问题描述】:

我有一个简单的 C 应用程序,它使用 POSIX struct 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 都会停止在标准头文件中转储各种垃圾。

标签: c gcc posix c11


【解决方案1】:

标头&lt;signal.h&gt; 是标准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 会清除错误,我不知道为什么。你的答案解释了 id。谢谢。
  • 使用 -std=gnu11 而不是 -std=c11 也应该可以解决问题。
【解决方案2】:

这是因为 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多