2010-09-28 74 views
1

我有一个奇怪的构建问题。无法使用gcc构建sigqueue示例,但g ++可以吗?

我有一个简单的测试程序,将sigqueue发送到另一个进程。

这个小的代码示例生成并运行时,我作为一个c + +程序(用g ++编译) ,但当我编译为ac程序(与gcc)我得到一个错误,他无法找到sigval结构。

简短的例子:

#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 
#include <unistd.h> 
#include <sys/types.h> 

int main(int argc, char *argv[]) 
{ 
     sigval value; 
     value.sival_int = 123; 
     sigqueue(0,SIGUSR1, value); 
} 

请注意,我取代了PID为0,以简化这个问题。

如果我用gcc编译我得到这个:

$> gcc sigusr1_mini.c 
sigusr1_mini.c: In function ‘main’: 
sigusr1_mini.c:9: error: ‘sigval’ undeclared (first use in this function) 
sigusr1_mini.c:9: error: (Each undeclared identifier is reported only once 
sigusr1_mini.c:9: error: for each function it appears in.) 
sigusr1_mini.c:9: error: expected ‘;’ before ‘value’ 
sigusr1_mini.c:10: error: ‘value’ undeclared (first use in this function) 

缺少什么我在这里,为什么他不能找到的sigval结构? 为什么g ++可以找到它?

感谢 约翰

+0

随意添加评论有关为什么这个问题被downvoted ... – Johan 2010-09-28 14:31:43

+0

我觉得这有帮助。看起来像是值得我高兴的。 – Jake88 2012-09-25 14:15:46

回答

5

在C,structunion标签不介绍,可以在自己喜欢的,他们用C做使用++名称。你必须把它拼出来:

union sigval value; 
+0

在C++中,它们也不是标识符,但如果没有歧义,就可以直接使用。 – 2010-09-28 11:43:07

+0

@Jens Gustedt:这个更新是否准确? – caf 2010-09-28 12:01:52

+1

嗯,很难。我会去做类似'...标签不能代替普通标识符的地方,就像它们可能在C++中那样。 – 2010-09-28 12:50:20

1

如何在h文件中定义sigval? C编译器可能需要全定义,例如:

union sigval value;