在C lang FAQ我发现了以下代码:
void f(ipp)
int **ipp;
{
static int dummy = 5;
*ipp = &dummy;
}
我测试了用-Wall -std=c11 -pedantic
标志编译它,它编译时没有警告或错误。这怎么可能——在函数名和它的块之间声明的变量?
编辑:
发布几个小时后,经过多次回答,我发现该问题已作为重复项关闭。我不同意关闭的决定。事实上,到目前为止,这里给出的重复问答和答案虽然大致正确,但并没有具体回答我的问题。
我的查询是关于出现在函数名及其块之间的变量声明。好吧,这就是最初的 K&R 风格,但我仍然觉得声明的位置令人震惊。阅读了描述 ANSI C89 的 K&R 第二版书后,我意识到以前的风格允许以不同的方式声明函数参数,但是 AFAIK 那本书没有显示以这种方式进行的声明。也许确实如此,但我已经忘记了。
我相信最好单独提出关于这个特定问题的问题,以防其他人在未来被它抛出。我的问题应该代表任何能够阐明如何决定允许在这个奇怪的位置声明参数的人。你从 C 和所有受 C 启发的语言中得到的印象是,在标记和它的大括号之间没有任何东西。我的问题提请注意一个重要的例外,即使它是 30/40 岁,也应该强调它的基本原理。
编辑 2:
我现在发现 C++ 语法允许在函数名和它的块之间添加一个标记。即便如此,介于两者之间的整个声明行的想法更为严重,值得向 C 新手指出,这是他们可能遇到的一个怪癖。我查过,K&R 第二版书确实没有明确提到这一点。