在C 11环境中使用VLA
Using VLAs in a C++11 environment
我得到已经存在的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 的严格超集。
- 枚举环境变量的惯用C++14/C++17方法
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- C++中的VLA,扩展名为std=C++11
- 创建一个包含 c++ 默认值的环境文件
- 定义C++新的环境变量并在 bat 文件中使用它
- 用于在并发环境中访问 MMIO 的软件模式
- docker 构建失败:无法设置环境变量
- 如何在不传递命令行参数的情况下在 c++ 中设置环境变量
- C++环境变量
- 在编译时为运行时设置环境变量
- 在 3ds Max 中更新进度条后,环境和效果 UI 不刷新
- 如何使用可视化代码和平台IO将环境变量注入CPP文件?
- 访问 PlatformIO 中的外部环境变量
- 在 Azure DevOps 构建管道中使用英特尔C++编译器为 Linux 环境构建C++代码
- 如何注册枚举类型到QJSEngine,以便在脚本环境中使用?
- WSL 看不到环境变量
- 启动 dll 时 C# 环境堆栈溢出
- "C.UTF-8" C++ Windows 上的语言环境?
- 如何正确取消析构函数中的 Boost deadline_timer(在多线程环境中)?
- 在C 11环境中使用VLA