这段代码在C语言中是否合法?

4

函数wait()在另一个函数中声明。这样做合法吗?

void panic(const int reason, const char *strg) 
{
int ErrNo;
struct machine_attributes mach;
int ret, docstat, cnt;
pid_t pid, wait(int *), setsid(void); 
    ......
}

谢谢您!

1
在C语言中,函数不能在其他函数内定义,尽管一些编译器扩展允许这样做。 - templatetypedef
3
不可以,但是它们可以在其他函数内部被声明。 - CB Bailey
该声明具有作用域,但它允许您从出现声明的函数内部调用已声明的函数。 - CB Bailey
1
@Mahesh,它们不是调用,而是声明。 - Jim Balter
@Mahesh - 在这个问题中不是这种情况,但是是的,两个函数可以用逗号分隔调用。 - Jim Buck
显示剩余4条评论
2个回答

6

是的,只要这个声明与函数的实际定义相匹配。

pid_t pid, wait(int *), setsid(void);

这里声明了三个实体:一个名为pidpid_t,一个名为wait的函数(接受int*并返回pid_t),以及一个名为setsid的函数(不接受参数并返回pid_t)。 pid的声明也是一个定义。

如果错误地给这个正确的答案评了低分的人能够站出来,解释一下自己的行为并将低分移除,我们会非常感激。 - Jim Balter
我在 Stack Overflow 上看到的主要问题是,大多数投反对票的人不关心给出反对的原因。他们应该解释一下原因,这将有助于每个人理解并从错误中学习。也许现在是发布一个维基帖子来解决这个问题的时候了! - Mahesh
@Mahesh 对于没有附带评论的负分评价,SO可能会施加更重的声望惩罚,这可能是一个好主意。 - Jim Balter
@Jim Balter - 我即将在维基上发布这篇文章。 - Mahesh
@Jim:这可能会有用;请看我的回答。 - R.. GitHub STOP HELPING ICE
显示剩余2条评论

0

是的,这是合法的C语言,并且在某些罕见情况下可能会很有用,例如如果您有一个使用waitstatic链接的函数的普通C(非POSIX导向)源文件,并突然意识到需要从该文件中的一个函数调用POSIX wait。通过在调用它的函数中限定声明,您可以避免与文件范围内的static定义wait发生冲突。

请注意,pid_t可以从其他未声明wait(或任何函数)的头文件中获取,但在其他情况下,由于缺少类型,您可能无法使用此类技巧。

是的,有些人可能会称其为对语言的可怕的黑客/滥用。 :-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接