首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++11环境中使用VLAs

在C++11环境中使用VLAs
EN

Stack Overflow用户
提问于 2016-06-28 20:12:37
回答 1查看 512关注 0票数 3

我得到了已经存在的C代码,它使用了C99风格的VLA。就像这个:

代码语言:javascript
复制
 int foo(int n, double l[n][n], double a[n][n]);

我想将头包含在我的C++11项目中。由于C++不允许这种构造,所以我使用extern "C"来包含这些头文件。然而,编译器一点也不喜欢这样做。

代码语言:javascript
复制
./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]);
                                 ^~~~~~

我想我在某个地方读到VLAs在C11中成为可选的。这是否意味着gcc完全摆脱了它?如果是这样的话,除了extern "C",我还能做什么呢?当然,我可以用较旧的C标准编译源代码。但我必须以某种方式把标题包括进去。有什么想法吗?

重写整件事只会是最后的办法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-20 04:02:41

我想将头包含在我的C++11项目中。由于C++不允许这种构造,所以我使用extern "C“来包含这些头文件。然而,编译器一点也不喜欢这样做。

事实上,这是一个问题,因为C++11没有VLA。您可能需要考虑用C编写一个包装器,将其编译为C并在C++中使用它。

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

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

除了"C“之外,我还能做什么?

仅靠extern "C"无助于您,因为正如我所解释的,C++11没有VLA。考虑到在C中,数组是一个连续序列,这意味着它都是一个分配,所有元素都一个接一个地出现。因此,这样的二维数组被表示为n * n元素的一维数组.您的包装器(也使用extern "C" )应该将指向该扁平数组的第一个元素的double *转换为指向该扁平数组的第一个n元素的double (*)[n]

这是C11中的类型传递,它不需要向C++公开,因为接受double *的函数被编译为C11代码(而不是 C++11),并使用链接器链接到C++11项目。C++11不需要查看函数下面的C11代码。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38085440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档