"type name[size]" 在函数参数中是什么意思?

What does "type name[size]" mean in a function argument?

我在分析 SKIA 源代码时发现了这个:

constexpr unsigned kMaxBytesInUTF8Sequence = 4;
// ...
SK_SPI size_t ToUTF8(SkUnichar uni, char utf8[kMaxBytesInUTF8Sequence] = nullptr);
                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

我知道(如果我错了请原谅)char utf8[kMaxBytesInUTF8Sequence] 会衰减到 char*char utf8[] 或只是 char* utf8

所以,我觉得这样写是没有意义的吧?

具有数组类型的函数参数被编译器调整为指向数组元素类型的指针。

因此这些函数声明

SK_SPI size_t ToUTF8(SkUnichar uni, char utf8[kMaxBytesInUTF8Sequence] = nullptr);
SK_SPI size_t ToUTF8(SkUnichar uni, char utf8[10] = nullptr);
SK_SPI size_t ToUTF8(SkUnichar uni, char *utf8 = nullptr);

声明同一个函数。

这个参数声明

char utf8[kMaxBytesInUTF8Sequence]

用于自我说明,指定传递的数组必须不大于 kMaxBytesInUTF8Sequence 个元素,否则用户可以传递空指针。

在函数参数中,数组符号只是语法糖。括号内指定的大小被忽略,实际参数类型只是一个指针。

换句话说,这个声明:

constexpr unsigned kMaxBytesInUTF8Sequence = 4;
// ...
SK_SPI size_t ToUTF8(SkUnichar uni, char utf8[kMaxBytesInUTF8Sequence] = nullptr);

编译器是这样处理的:

constexpr unsigned kMaxBytesInUTF8Sequence = 4;
// ...
SK_SPI size_t ToUTF8(SkUnichar uni, char* utf8 = nullptr);

然而,在数组符号中指定参数声明作为 文档 函数 期望 一个 char[] 数组的程序员大小 至少 kMaxBytesInUTF8Sequence 被传入。但是编译器没有做任何事情来实际 验证 那个。