在C 11环境中使用VLA

Using VLAs in a C++11 environment

本文关键字:VLA 环境      更新时间:2023-10-16

我得到已经存在的C代码,并且使用C99风格的VLA。像这样:

 int foo(int n, double l[n][n], double a[n][n]);

我想在我的C 11项目中包括标头。因为C 不允许我使用extern "C"的这类构造包含这些标头文件。但是,编译器根本不喜欢。

./header.h:23:42: error: use of parameter outside function body before ‘]’ token
 void foo(int n, double l[n][n], double x[n], double b[n]);
                           ^
./header.h:23:45: error: use of parameter outside function body before ‘]’ token
 void foo(int n, double l[n][n], double x[n], double b[n]);
                              ^
./header.h:23:46: error: expected ‘)’ before ‘,’ token
 void foo(int n, double l[n][n], double x[n], double b[n]);
                               ^
./header.h:23:48: error: expected unqualified-id before ‘double’
 void foo(int n, double l[n][n], double x[n], double b[n]);
                                 ^~~~~~

我想我在某个地方读到VLA在C11中成为可选的。这是否意味着海湾合作委员会完全摆脱了它?如果是这样,除了extern "C",我该怎么办?当然,我可以用较旧的C标准来编译源。但是我必须以某种方式包括标题。有什么想法吗?

重写整个过程只会是最后一个度假胜地的方法。

我想在我的C 11项目中包括标头。因为C 不允许使用Extern" C"来包含这些标头文件。但是,编译器根本不喜欢。

的确,这是一个问题,因为C 11 没有 vlas。您可能需要考虑在C中编写包装器,将其编译为C,并在C 中使用。


我想我在某个地方读到VLA在C11中成为可选的。这是否意味着GCC完全摆脱了它?

不,当将代码编译为C11时,GCC仍然支持VLA。但是,这与您的问题无关,这是关于C 11的完全不同的语言,它不支持VLA。


除外部" C"以外,我该怎么办?

extern "C"单独没有帮助您,因为正如我所解释的那样,C 11没有VLA。考虑到在C中,一个数组是A 连续序列,这意味着它是所有一个分配所有元素都发生在另一个。因此,这样的二维阵列被称为n * n元素的一维阵列。您的包装器(也使用extern "C")应将double *转换为指向该扁平数组的第一个元素的double (*)[n]指向该扁平数组的第一个n元素。

这是C11中的一个类型,不需要暴露于C ,因为采用double *的功能,该函数被编译为C11代码(不是 c 11)并链接了使用链接器到C 11项目。C 11不需要在功能下方看到C11代码。

因此,您需要重写标题(您可以将其独立于.h文件作为.hpp文件维护),值得庆幸的是,这不是完整重写。至少希望您已经学会了, C 不是C 的严格超集。