【问题标题】:What does "type name[size]" mean in a function argument?函数参数中的“类型名称 [大小]”是什么意思?
【发布时间】:2021-11-05 12:38:21
【问题描述】:

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

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

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

因此,我认为这样写是没有意义的,对吧?

【问题讨论】:

  • 是的,编写这样的代码没有任何意义或目的。特别是在提供默认值nullptr 时。

标签: c++ arrays pointers implicit-conversion function-declaration


【解决方案1】:

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

因此这些函数声明

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 元素,否则用户可以传递空指针。

【讨论】:

    【解决方案2】:

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

    换句话说,这个声明:

    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 被传入。但是编译器实际上并没有做任何事情来验证

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多