多维数组的未知边界参数:C和C++之间的区别

5
以下程序可以编译为C程序:
#include <stdlib.h>
#include <stdio.h>

void f(int n, int m, int x[n][m]) {
  printf("x[0][2] = %i\n",x[0][2]);
}

int main() {
  int v[][3] = { {0,1,2}, {3,4,5} };

  f(2,3,v);
}

然而,当使用g++编译为C++时,我遇到了以下问题:

main.c:4:29: error: use of parameter outside function body before ‘]’ token
 void f(int n, int m, int x[n][m]) {
                             ^

看起来C语言的这个特性在C++中不存在。是否有任何标志可以传递给g++,以便它接受该代码?


10
C++不支持可变长度数组。 - user438383
2
C和C++是两种不同的编程语言。你可以编译C代码或者C++代码。 - NathanOliver
1
不,没有标志可以同时使用C和C++...您可以查看extern C,例如 https://dev59.com/P3NA5IYBdhLWcg3wPLP-,但如果要使用C++,也许可以使用 std::vector? - doctorlove
1
@ThomasWeller 不,它不包括。仔细阅读问题。事实上,gcc确实有VLA作为扩展(无论它们是否标准化,它都可以工作),但是尽管如此,gcc仍然不能编译此代码。 - 463035818_is_not_a_number
1
GCC会接受 void f(int n, int m, int (*x)[]) 这样的函数声明,在C语言中,你可以在函数内部完成类型转换并补全代码:int (*a)[m] = x;,但是GCC会报错。 - Eric Postpischil
显示剩余8条评论
1个回答

2
似乎C语言中的这个特性在C++中不存在。
正确。
是否有任何标志可以传递给g++,以便它接受代码?
没有,没有这样的功能允许VLA作为参数列表的一部分。您将不得不将代码编译为C。
其他类似的gcc扩展存在,请参见:https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html

1
从您链接的文档中可以看到:“您还可以将可变长度的数组用作函数参数:”,然后是一个与OPs不太不同的示例。 - 463035818_is_not_a_number
1
@463035818 不是一个数字。它是数字。gcc 没有任何意义。 - Lundin
1
请注意,链接的文档包含C、C90和C++的所有内容。因为...gcc提供高质量的文档。 - Lundin
1
是的。文档并没有错。它们说在C++中可以使用VLA,没错。它们也说你可以将其作为参数使用,没错,只是不能在C++中这样做。 - 463035818_is_not_a_number
1
注意这里还有第二个问题;编译器反对在声明符中使用先前的参数。讨论一下C++关于此的规则可能会很有趣。即使GCC支持参数中的可变长度数组,参数的作用域或生命周期也可能是一个问题。 - Eric Postpischil
显示剩余28条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接