在C lang FAQ,我找到了以下代码:
void f(ipp)
int **ipp;
{
static int dummy = 5;
*ipp = &dummy;
}
我测试了使用-Wall -std=c11 -pedantic
标志进行编译,并且编译时没有警告或错误。这怎么可能-在函数名称及其块之间声明一个变量?
不是any变量,它是函数参数。只是另一种编程风格,称为K&R风格。
很久以来不赞成使用此语法,但在C17中仍然有效。该功能的删除最近已投票给C2x,请参见第6.30点:
通常,通过以下方式在C标准中定义功能定义
function-definition:
declaration-specifiers declarator declaration-listopt compound-statement
declaration-list:
declaration
declaration-list declaration
将包含declaration-list
的功能定义命名为具有与具有参数类型列表的功能定义相反的标识符列表的功能定义。
因此在函数声明器中使用了标识符列表
void f(ipp)
^^^^
需要在函数体之前声明的地方
void f(ipp)
int **ipp;
^^^^^^^^^
这是一种旧式的函数定义,不建议使用,因为这样的定义没有提供可被编译器检查的函数原型。