【发布时间】:2020-11-12 06:51:24
【问题描述】:
以下程序在 gcc 但不是 g++ 编译:
void foo(int (*x)[])
{
// do something
}
int main()
{
int x[3];
foo(&x); // g++ error: cannot convert ‘int (*)[3]’ to ‘int (*)[]’
return 0;
}
我正在尝试使用一个用 ANSI C 编写的库,所以我无法控制 foo 的接口。
为什么这是有效的 C 而不是有效的 C++ 已在 this QA 中讨论过。我的问题是:如何使用 C++ 中的此类声明调用函数 foo?
【问题讨论】:
-
你认为
int(*)[]比简单的int*做得“更好”吗? -
我无法谈论在 C 中的合法性,但是 C++ 编译器会在您传递引用数组时看到您的声明
foo(&x),而不是您对接受数组的foo(int (*x)[])的定义整数。这就是为什么没有 C++ 编译器会编译示例中的代码的原因。 -
当你有一个指向数组的指针时,数组的大小是类型的一部分。你不能有“指向任何数组的指针”。
-
@alteredinstance
x是一个数组,而不是指向数组的指针,因此,&x确实是指向该数组的指针。这里没有引用也没有指针数组。 -
@HugoBurd 我会重新打开,你可以编辑