我有一段已经存在的 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]);
^~~~~~
我记得在C11中,可变长数组(VLAs)变成了可选项。这是否意味着gcc完全摆脱了它?如果是,除了使用extern "C"
之外,我还能做什么?当然,我可以用较旧的C标准编译源代码。但我必须以某种方式包含头文件。有什么想法吗?
重新编写整个内容只会是最后的手段。
extern "C" { void foo(int n, double * l, double * x, double * b); }
,它应该可以正确调用。(不过这只是猜测。) - JohnB--std=gnu++14
,它启用了 C++14 的特性,而不是--std==c++14
,它启用了 C++14 的特性并禁用了所有 g++ 扩展。 - Ben Voigtextern "C"
包装函数,该函数提供适用于C++的接口,并将其参数传递(或复制)到使用VLAs的函数中。该包装器将需要作为C实现(因此编译),但它必须提供一个有效的C++签名(返回类型和参数类型)。就个人而言,我会将该函数重写为C++并完成它。 - Peter-std=c11
)中继续支持C代码中的可变长度数组(VLAs);它不定义宏__STDC_NO_VLA__
。(这并不适用于C++代码。) - Keith Thompsonextern "C"
也不能使它们成为C++的一部分,无论版本如何(这里只是明显的陈述)。 - n. m.