2012-11-29 51 views
2

如果我编译std = c99下面的程序,我得到一个错误,但程序编译罚款没有c99标志。为什么?为什么我无法使用std = c99声明sigset_t?

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

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


[email protected] 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

它需要'_GNU_SOURCE'与C99标准编译此。改用'gcc -std = c99 -D_GNU_SOURCE blah.c -o blah'来代替。 – 2012-11-29 03:22:22

+0

@ user9000为什么要用'-std = c99'呢?只需使用'gcc -std = gnu99'即可完成。 – melpomene

+0

@melpomene这与它有什么关系? '_GNU_SOURCE'使一些GNU扩展可用。 – 2012-11-29 03:27:48

回答

2

因为sigset_t不是在标准C <signal.h>一部分,你要求与-std=c99严格标准的兼容性。也就是说,一个严格标准的C程序可以这样做:

#include <signal.h> 

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

并期望它工作。

+0

那么,c99中sigset_t的对应部分是什么呢? – Jimm

+0

...什么都没有?为什么你认为这种事情存在于标准C? – melpomene

+0

如果你找不到'sigset_t',那么就像下面的代码一样自己定义它。它只是一个'无符号长' –

-1

sigset_t是不是在C99标准,afaik其POSIX。

这里的定义是:

#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; 
相关问题