C与C++未知边界多维数组参数的差异及编译兼容问询
C变长数组(VLA)在C++编译中的兼容办法
问题场景
以下C代码可通过GCC正常编译:
#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++编译时会报错:
main.c:4:29: error: use of parameter outside function body before ‘]’ token void f(int n, int m, int x[n][m]) { ^
这段代码用到了C99引入的**变长数组(VLA)**特性,该特性不属于C标准,因此默认无法被G接受。
解决办法
GCC提供了扩展选项来支持这类C特性在C++中的编译,有两种可行方式:
- 使用
-fpermissive编译选项:该选项会放宽C++的语法检查规则,允许部分不符合标准但符合GNU扩展的代码通过编译g++ -fpermissive main.c - 指定GNU系的C++标准版本(如
gnu++11、gnu++17等):这类标准默认启用了包括变长数组在内的GCC扩展特性g++ -std=gnu++11 main.c
内容的提问来源于stack exchange,提问作者Bérenger
相关产品推荐
相关产品推荐

