我遇到过一些可以编译的C代码,但我不明白为什么.具体地说,我有一个C库,它有很多使用这种格式的代码:

void get_xu_col(int i_start,
                int n,
                double x[n],
                int n_x,
                int n_u,
                int n_col,
                double xu_col[n_col][n_x + n_u]){
    ... 
}

int main(){
    ...
    double xu_col[n_col][n_x + n_u];
    get_xu_col( ..., xu_col );
    ...
}

我不明白的是,为什么编译器允许在数组中调整大小.据我所知,尺寸必须固定(如xu_col[9][7])或未定义(如xu_col[][]).在上面的代码中,大小似乎不是编译时常量.

编译器是否只是忽略了这里的参数?或者它真的在对维度进行编译时判断?

如果是后者,则单独传递维度似乎很容易出错.

问题的第二部分是:

为什么C++中的版本不一样?当我将文件扩展名从.c改为.cpp并try 重新编译时,我得到

candidate function not viable: no known conversion from 'double [n_col][n_x + n_u]' to 'double (*)[n_x + n_u]' for 7th argument
void get_xu_col(int i_start, int n, double x[n], int n_x, int n_u, int n_col, double xu_col[n_col][n_x + n_u]);

我想知道我应该使用哪种习惯用法将这段代码转换成C++,因为显然前面的习惯用法可以在C中使用,但不能在C++中使用.

推荐答案

在C语言中,可以使用函数参数来定义可变长度数组参数的大小,只要该大小在参数列表中位于数组之前.这在C++中不受支持.

C++相关问答推荐

使用单个字节内的位字段

C语言中的strstr问题

C由四个8位整数组成无符号32位整数

双指针指向常量双指针的指针类型赋值不兼容

使用AVX2的英特尔2022编译器的NaN问题&;/fp:FAST

为什么我不能只在内存地址中添加一个int来寻址任何数组?

用C++实现余弦函数

这个计算C中阶乘的函数正确吗?

从TCP连接启动UDP(C套接字)

如何在双向表中实现线程安全,每个条目仅使用4位,同时避免任何全局锁?

从CentOS 7到Raspberry PI 2B的交叉编译-无法让LIBC和System Include标头一起工作

STM32 FATFS用户手册(Um1721)中的代码正确吗?

如果类型是新的,offsetof是否与typeof一起工作?

分支预测和UB(未定义的行为)

C struct 中的冒泡排序

memcmp 是否保证按顺序比较字节?

尽管将其标记为易失性,但 gcc 是否优化了我的等待代码?

如何用用户输入的多个字符串填充数组?

从管道读取数据时丢失

获取 struct 中匿名 struct 的大小