【问题标题】:Functions accepting C/C++ array types接受 C/C++ 数组类型的函数
【发布时间】:2026-02-06 21:10:02
【问题描述】:

在将数组作为参数传递时,g++ 似乎忽略了数组大小的差异。即,即使使用-Wall,以下编译也不会出现警告。

void getarray(int a[500])
{
    a[0] = 1;
}

int main()
{
    int aaa[100];
    getarray(aaa);
}

现在,我了解了传递指针的底层模型,显然我可以将函数定义为getarray(int *a)。但是,我希望 gcc 在我明确指定数组大小时至少会发出警告。

有没有办法绕过这个限制? (我来宾 boost::array 是一种解决方案,但我有很多使用 c 样式数组的旧代码,这些代码被提升为 C++...)

【问题讨论】:

  • @Richard:该问题的答案包含此问题的线索。然而问题是不同的。这个是关于类型保存的。

标签: c++ strong-typing


【解决方案1】:

数组作为指向其第一个参数的指针传递。如果大小很重要,则必须将函数声明为void getarray(int (&a)[500]);

C 的习惯用法是这样传递数组的大小: void getarray(int a[], int size);
C++ 习惯用法是使用 std::vector (或最近的 std::tr1::array )。

【讨论】:

  • 使用 int a[500] 只是传递一个指向 int 的指针。使用 int(&a)[500] 传递对包含 500 个元素的数组的引用。它们是不同的类型,编译器会看到不匹配的情况。顺便说一句,使用 int(&a)[500] 你不能再传递一个用 new int[500] 分配的数组了!
  • 太棒了!一个有用的技术。据我所知,实际生成的代码是相同的。
【解决方案2】:

我第二个what rpg said。但是,如果您想使用任何大小的数组调用函数,您可以使用模板来执行此操作:

template< std::size_t N>
void getarray(int (&a)[N])

【讨论】:

  • +1,这可能是一种有用的方法,但请注意,您不能再使用普通的 int * 调用此函数!
  • @j_random_hacker:我实际上认为这是一个优势。