为什么我会收到警告:标量初始值设定项周围的大括号?

Why do I get warning: braces around scalar initializer?

我有这个代码:

typedef char **Runlevel[];
Runlevel runlevel_default = {
    { "/usr/bin/test", NULL },
};

如果我尝试编译它,我会收到如下警告:

然而,当我这样写的时候:

char *args[] = { "/usr/bin/test", NULL };

Runlevel runlevel_default = {
    args
};

我没有收到任何警告。有什么问题吗?

编辑:我的目标是创建一个运行级别数组。就像@Paul Ogilvie 的评论一样,我删除了嵌套括号,但现在当我做这样的事情时:

Runlevel runlevel_default[] = {
    { "/usr/bin/test", NULL }
};

我收到另一个错误:error: array type has incomplete element type ‘Runlevel’ {aka ‘char **[]’}

现在有什么问题?

您的 typedef char **Runlevel[]; 声明并未定义您似乎想要什么;使用该语句,RunLevel 不是 char* 指针的二维数组,而是 1-D 数组 char** 个元素。因此,不仅 runlevel_default 变量的后续初始化有太多的大括号,而且各个元素(字符串文字和 NULL 标记)的类型错误(它们是 'valid' char* 值但不是 char**).

所以,您可能正在寻找类似 typedef char *Runlevel[][]; 的东西 – 但这是无效的,因为只有 多维数组的维度可以有一个未指定大小,当此类数组类型为 declared/initialized.

时由编译器确定

因此,假设数组的每个子元素都是 两个 (并且 只有 两个)char* 指针(可能是字符串文字),那么您需要将 2 指定为最后一个(最里面的)维度:

typedef char* Runlevel[][2];

Runlevel runlevel_default = {
    { "/usr/bin/test", NULL },
    { "/usr/bin/test2", NULL },
    { "/usr/bin/test3", NULL },
};

使用此语法,typedef 中 'empty' 维度的值将由编译器根据您包含的 char* 值的大括号对数来确定(也用大括号括起来的)初始化列表;在上面的代码中,runlevel_default 变量将被声明为 char* runlevel_default[3][2]。但是,您也可以声明一个 Runlevel 类型的不同变量,具有不同的 'outer' 维度,如下所示:

Runlevel runlevel_different = {
    { "/usr/bin/test", NULL },
    { "/usr/bin/test2", NULL },
    { "/usr/bin/test3", NULL },
    { "/usr/bin/test4", NULL },
    { "/usr/bin/test5", NULL }, // This time, we have 5 as the outer dimension
};