【发布时间】:2020-06-16 10:03:37
【问题描述】:
我想与我用 C++ 程序编写的 C 库进行交互。 C 库是使用现代 C 编写的,并使用 static 数组说明符来显示数组的最小长度,或者指针不能是 NULL。
当我尝试使用此功能编写与 extern "C" 函数接口的程序时,我收到以下消息:
错误:静态数组大小是 C99 功能,在 C++ 中不允许
不能与这个 C 库交互吗?我是否必须修改 C 库,或者是否有替代方案?
这是一个导致错误的示例程序:
// foo.h
#ifndef FOO_H
#define FOO_H
void foo(int i[static 1]);
#endif //FOO_H
// foo.c
#include <stdio.h>
void foo(int i[static 1]) {
printf("%i", i[0]);
}
// main.cpp
extern "C"
{
void foo(int i[static 1]);
}
int main() {
int i[] = {1};
foo(i);
}
【问题讨论】:
-
你不能神奇地让 C++ 编译器理解 VLA。
extern "C"仅指定语言绑定,而不是神奇地教 C++ 编译器所指的语言。 -
如果我错了,请纠正我,但 C 中的函数签名只是一个未损坏的名称。
extern C的意思是,“嘿,不要弄乱这个名字。这是函数签名”。您实际上不应该在extern "C"块中定义函数,对吗?你只是应该链接到它?所以你会写extern "C" { void foo(int i[]); }并确保你链接到图书馆。我没有做很多(或根本没有)与 C 库的交互。我以前看过。 -
同样的错误?我的建议虽然省略了
static关键字。你根本不应该得到那个错误。 -
我会写一个答案。对此有一些警告。一方面,创建库的 C 编译器可能对代码进行了一些优化,期望所有传入的数组至少是给定的大小。例如,可能循环展开到大小 N?谁知道。如果编译后的代码要求数组是那个大小,而你传递的东西不够大,那么这种类型安全就会被破坏。所以调用函数时必须非常小心。我不确定如何确保安全。
-
@John 虽然在
static 1的情况下,它是多余的,因为标准 C 和 C++ 无论如何都不支持零大小的数组。也许这应该表明“指针不应该是空指针”