"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
被传入。但是编译器没有做任何事情来实际 验证 那个。
我在分析 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
被传入。但是编译器没有做任何事情来实际 验证 那个。