我得到了已经存在的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]);
^~~~~~我想我在某个地方读到VLAs在C11中成为可选的。这是否意味着gcc完全摆脱了它?如果是这样的话,除了extern "C",我还能做什么呢?当然,我可以用较旧的C标准编译源代码。但我必须以某种方式把标题包括进去。有什么想法吗?
重写整件事只会是最后的办法。
发布于 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的严格超集。
https://stackoverflow.com/questions/38085440
复制相似问题