使用新式函数声明引用尚未提及的函数参数

问题描述 投票:1回答:2

被迫使用可变长度数组功能用于打印方形矩阵的辅助函数,我将其定义如下:

void print_matrix(M, dim)
     unsigned dim;
     int M[dim][dim];
{
    /* Print the matrix here. */
    ...

好消息是,代码工作并且按照我希望的顺序显示其参数。

坏消息是,我不得不使用“旧式”函数声明语法,以便在dim的声明中引用尚未声明的参数M,这显然被认为是obsoletedangerous

有没有一种直接的方法来做同样的“新式”函数声明而不改变参数的顺序? (如果不是,在这种特殊情况下,它是否被认为可以接受使用旧式语法?)

c c99 variable-length-array
2个回答
2
投票

在便携式(标准)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不支持参数转发声明。


0
投票

原型之前的旧式声明在语法上是丑陋的,但并不比新的样式声明更危险。

void print_matrix(int M[*][*], unsigned dim);
void print_matrix(M, dim)
     unsigned dim;
     int M[dim][dim];
{
  ...
}

标准的作者认识到旧式声明是完成任务的有效,有用和充分的手段,并决定编写允许使用新式声明的规则将是太多的工作,所以他们不想要麻烦。因此,原型和旧式声明的组合是实现适当语义的唯一方法。

© www.soinside.com 2019 - 2024. All rights reserved.