modernize-avoid-c-arrays

cppcoreguidelines-avoid-c-arrays 作为此检查的别名重定向到此处。

hicpp-avoid-c-arrays 作为此检查的别名重定向到此处。

查找 C 样式数组类型并推荐使用 std::array<> / std::vector<>。所有类型的 C 数组都会被诊断。

对于不完整 C 样式数组类型的参数,最好使用 std::span / gsl::span 作为替换。

但是,修复建议在头文件中可能存在危险,因此现在不会发出修复建议。

int a[] = {1, 2}; // warning: do not declare C-style arrays, use 'std::array' instead

int b[1]; // warning: do not declare C-style arrays, use 'std::array' instead

void foo() {
  int c[b[0]]; // warning: do not declare C VLA arrays, use 'std::vector' instead
}

template <typename T, int Size>
class array {
  T d[Size]; // warning: do not declare C-style arrays, use 'std::array' instead

  int e[1]; // warning: do not declare C-style arrays, use 'std::array' instead
};

array<int[4], 2> d; // warning: do not declare C-style arrays, use 'std::array' instead

using k = int[4]; // warning: do not declare C-style arrays, use 'std::array' instead

但是,extern "C" 代码将被忽略,因为在 C 代码和 C++ 代码之间共享此类头文件很常见。

// Some header
extern "C" {

int f[] = {1, 2}; // not diagnosed

int j[1]; // not diagnosed

inline void bar() {
  {
    int j[j[0]]; // not diagnosed
  }
}

}

类似地,main() 函数将被忽略。它的第二个和第三个参数可以是 char* argv[]char** argv,但不能是 std::array<>

AllowStringArrays

当设置为 true(默认值为 false)时,将忽略从字符串字面量直接初始化的具有推断长度的字符数组类型变量。此选项不会影响长度无法推断的案例(类似于指针),如在类成员和参数中所见。示例

const char name[] = "Some name";