【问题标题】:why am i not able to declare sigset_t with std=c99?为什么我不能用 std=c99 声明 sigset_t?
【发布时间】:2012-11-17 01:55:25
【问题描述】:

如果我用 std=c99 编译下面的程序,我会得到一个错误,但程序在没有 c99 标志的情况下编译得很好。为什么?

#include <signal.h>
void x()
{
    sigset_t dd;
}

int main(void)
{
    x();
    return 0;
}


jim@cola temp]$ gcc -std=c99 blah.c -o blah
blah.c: In function ‘x’:
blah.c:9: error: ‘sigset_t’ undeclared (first use in this function)
blah.c:9: error: (Each undeclared identifier is reported only once
blah.c:9: error: for each function it appears in.)
blah.c:9: error: expected ‘;’ before ‘dd’

【问题讨论】:

  • 它需要_GNU_SOURCE 才能使用 C99 标准编译它。请改用gcc -std=c99 -D_GNU_SOURCE blah.c -o blah
  • @user9000 那为什么还要麻烦-std=c99呢?只需使用gcc -std=gnu99 即可完成。
  • @melpomene 这与它有什么关系? _GNU_SOURCE 提供了一些 GNU 扩展。
  • 抱歉没注意到你说的是gnu,还以为是89;P

标签: c linux gcc


【解决方案1】:

因为sigset_t 不是标准 C 中&lt;signal.h&gt; 的一部分,并且您要求与-std=c99 进行严格的标准兼容性。也就是说,一个严格标准的 C 程序可以做到:

#include <signal.h>

int sigset_t;
int main(void) { return 0; }

并期望它起作用。

【讨论】:

  • 那么,c99 中的 sigset_t 对应的是什么?
  • ...什么都没有?为什么你认为标准 C 中存在这样的东西?
  • 如果你找不到sigset_t 然后像下面的代码那样自己定义它。它只是一个unsigned long
  • @Aniket 这是一个糟糕的建议。
  • @melpomene 所以如果我想使用像 sigprocmask 这样的信号特定函数并且想要像限制这样的 c99 功能,我应该将什么标志传递给 gcc?
【解决方案2】:

sigset_t 不在 C99 标准中,但在 POSIX 中可用。您可以定义_POSIX_SOURCE_POSIX_C_SOURCE 以使sigset_t 可用。

这是定义:

#define _NSIG 64 
#define _NSIG_BPW 32 
#define _NSIG_WORDS (_NSIG / _NSIG_BPW) 

typedef unsigned long old_sigset_t; /* at least 32 bits */ 

typedef struct { 
unsigned long sig[_NSIG_WORDS]; 
} sigset_t; 

另见What does #define _POSIX_SOURCE mean?

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 2012-02-28
    • 2018-08-21
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 2010-11-04
    相关资源
    最近更新 更多