为什么我不能用std = c99声明sigset_t?

时间:2012-11-29 03:13:19

标签: c linux gcc

如果我用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’

2 个答案:

答案 0 :(得分:2)

由于sigset_t不属于标准C中<signal.h>的一部分,因此您要求与-std=c99严格兼容标准。也就是说,严格标准的C程序可以做到:

#include <signal.h>

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

并期望它能够发挥作用。

答案 1 :(得分:0)

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?