为什么我会收到警告:标量初始值设定项周围的大括号?
Why do I get warning: braces around scalar initializer?
我有这个代码:
typedef char **Runlevel[];
Runlevel runlevel_default = {
{ "/usr/bin/test", NULL },
};
如果我尝试编译它,我会收到如下警告:
warning: braces around scalar initializer
warning: initialization of ‘char **’ from incompatible pointer type ‘char *’
warning: excess elements in scalar initializer
然而,当我这样写的时候:
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
};
我有这个代码:
typedef char **Runlevel[];
Runlevel runlevel_default = {
{ "/usr/bin/test", NULL },
};
如果我尝试编译它,我会收到如下警告:
warning: braces around scalar initializer
warning: initialization of ‘char **’ from incompatible pointer type ‘char *’
warning: excess elements in scalar initializer
然而,当我这样写的时候:
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
};