被迫使用可变长度数组功能用于打印方形矩阵的辅助函数,我将其定义如下:
void print_matrix(M, dim)
unsigned dim;
int M[dim][dim];
{
/* Print the matrix here. */
...
好消息是,代码工作并且按照我希望的顺序显示其参数。
坏消息是,我不得不使用“旧式”函数声明语法,以便在dim
的声明中引用尚未声明的参数M
,这显然被认为是obsolete和dangerous。
有没有一种直接的方法来做同样的“新式”函数声明而不改变参数的顺序? (如果不是,在这种特殊情况下,它是否被认为可以接受使用旧式语法?)
在便携式(标准)C中,你不能做你所展示的。您必须在矩阵之前指定尺寸。问题中的原始代码是:
void print_matrix(M, dim)
unsigned dim;
int (*M)[dim][dim];
{
并且无法直接翻译 - 它需要这样的原型,矩阵前面的维度:
void print_matrix(unsigned dim, int (*M)[dim][dim]);
这允许您使用3D数组调用该函数。或者,使用问题中的修订符号,您可以打印2D数组:
void print_matrix(unsigned dim, int M[dim][dim]);
海湾合作委员会提供extension协助。引用手册:
如果要先传递数组,然后再传递长度,可以在参数列表中使用前向声明 - 另一个GNU扩展。
struct entry tester (int len; char data[len][len], int len) { /* … */ }
您可以在参数列表中编写任意数量的此类参数转发声明。它们可以用逗号或分号分隔,但最后一个必须以分号结尾,后面跟着“真实”参数声明。每个前向声明必须与参数名称和数据类型中的“真实”声明匹配。 ISO C99不支持参数转发声明。
原型之前的旧式声明在语法上是丑陋的,但并不比新的样式声明更危险。
void print_matrix(int M[*][*], unsigned dim);
void print_matrix(M, dim)
unsigned dim;
int M[dim][dim];
{
...
}
标准的作者认识到旧式声明是完成任务的有效,有用和充分的手段,并决定编写允许使用新式声明的规则将是太多的工作,所以他们不想要麻烦。因此,原型和旧式声明的组合是实现适当语义的唯一方法。