我最初将此作为另一个问题的答案:When a function has a specific-size array parameter, why is it replaced with a pointer?,但只是将其移至此处,因为它更直接地回答了这个问题。
以@Richard Corden's answer 和@sbi's answer 为基础,这里有一个更大的示例来展示以下原则:
-
使用对给定大小的数组的引用来强制执行给定的函数参数输入数组大小,如下所示:
void foo2(uint8_t (&array)[100])
{
printf("sizeof(array) = %lu\n", sizeof(array));
}
和:
-
允许任意大小的函数参数输入数组,通过使用一个函数template引用给定模板参数大小N的输入数组,例如这个:
template<size_t N>
void foo3(uint8_t (&array)[N])
{
printf("sizeof(array) = %lu\n", sizeof(array));
}
查看下面的完整示例:
注意这个函数原型是如何不知道数组大小的! (这里的100 只是对人类用户的视觉提示/提醒,但对编译器没有任何影响!):
void foo(uint8_t array[100]) {}
...此函数原型只允许输入固定大小为 100 的数组:
void foo2(uint8_t (&array)[100]) {}
...这个函数 template 原型允许任何输入大小的数组,并且在编译时静态知道它们的大小(因为这就是模板的工作方式):
template<size_t N>
void foo3(uint8_t (&array)[N]) {}
以下是完整示例:
您可以在此处自行运行:https://onlinegdb.com/rkyL_tcBv。
#include <cstdint>
#include <cstdio>
void foo(uint8_t array[100])
{
// is ALWAYS sizeof(uint8_t*), which is 8!
printf("sizeof(array) = %lu\n", sizeof(array));
}
void foo2(uint8_t (&array)[100])
{
printf("sizeof(array) = %lu\n", sizeof(array));
}
template<size_t N>
void foo3(uint8_t (&array)[N])
{
printf("sizeof(array) = %lu\n", sizeof(array));
}
int main()
{
printf("Hello World\n");
printf("\n");
uint8_t a1[10];
uint8_t a2[11];
uint8_t a3[12];
// Is `sizeof(array) = 8` for all of these!
foo(a1);
foo(a2);
foo(a3);
printf("\n");
// Fails to compile for these 3! Sample error:
// > main.cpp:49:12: error: invalid initialization of reference of type ‘uint8_t (&)[100]
// > {aka unsigned char (&)[100]}’ from expression of type ‘uint8_t [10] {aka unsigned char [10]}’
// > foo2(a1);
// > ^
// foo2(a1);
// foo2(a2);
// foo2(a3);
// ------------------
// Works just fine for this one since the array `a4` has the right length!
// Is `sizeof(array) = 100`
uint8_t a4[100];
foo2(a4);
printf("\n");
foo3(a1);
foo3(a2);
foo3(a3);
foo3(a4);
printf("\n");
return 0;
}
示例输出:
(编译器警告,指的是foo()内部的sizeof调用):
main.cpp:26:49: warning: ‘sizeof’ on array function parameter ‘array’ will return size of ‘uint8_t* {aka unsigned char*}’ [-Wsizeof-array-argument]
main.cpp:23:27: note: declared here
(stdout "标准输出"):
Hello World
sizeof(array) = 8
sizeof(array) = 8
sizeof(array) = 8
sizeof(array) = 100
sizeof(array) = 10
sizeof(array) = 11
sizeof(array) = 12
sizeof(array) = 100