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

und*_*ica 6 c c99 variable-length-array

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

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

好消息是,代码可以正常工作,并且其参数按照我希望的顺序排列。

dim坏消息是,我必须使用“旧式”函数声明语法才能引用的声明中尚未声明的参数M,这显然被认为是过时危险的

是否有一种直接的方法可以对“新式”函数声明执行相同的操作而不更改参数的顺序?(如果不是,在这种特殊情况下使用旧式语法是否可以接受?)

Jon*_*ler 3

在可移植(标准)C 中,您无法执行您所展示的操作。您必须在矩阵之前指定维度。问题中的原始代码是:

\n\n
void print_matrix(M, dim)\n     unsigned dim;\n     int (*M)[dim][dim];\n{\n
Run Code Online (Sandbox Code Playgroud)\n\n

并且不能直接翻译 \xe2\x80\x94 它需要一个像这样的原型,其维度在矩阵之前:

\n\n
void print_matrix(unsigned dim, int (*M)[dim][dim]);\n
Run Code Online (Sandbox Code Playgroud)\n\n

这允许您使用 3D 数组调用该函数。或者,使用问题中修改后的符号,您可以打印二维数组:

\n\n
void print_matrix(unsigned dim, int M[dim][dim]);\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

GCC 提供了一个扩展来提供帮助。引用手册:

\n\n
\n

如果你想先传递数组,然后传递长度,你可以在参数列表\xe2\x80\x94另一个GNU扩展中使用前向声明。

\n\n
struct entry\ntester (int len; char data[len][len], int len)\n{\n  /* \xe2\x80\xa6 */\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以在参数列表中写入任意数量的此类参数前向声明。它们可以用逗号或分号分隔,但最后一个必须以分号结尾,分号后跟 \xe2\x80\x9creal\xe2\x80\x9d 参数声明。每个前向声明必须与参数名称和数据类型中的 \xe2\x80\x9creal\xe2\x80\x9d 声明匹配。ISO C99 不支持参数前向声明。

\n
\n